Linq2SQL открывает неправильную базу данных

#c# #linq-to-sql

#c# #linq-to-sql

Вопрос:

Я открываю соединение LINQ 2 SQL для извлечения настроек из базы данных. В нашей тестовой среде есть несколько баз данных, которые мы используем для тестирования, и один из пользователей моего приложения использовал другую, чем я использую. Проблема в том, что данные все еще брались из базы данных, с которой я тестировал, а не из той, которую она использовала.

Для упрощения: * Я программировал с использованием DataBaseTestOne * Тестировщик изменил текст подключения на используемый DataBaseTestTwo * Данные были загружены из DataBaseTestOne

Код, который я использую, выглядит следующим образом:

     try
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        using (DbCommunicationDataContext context = new DbCommunicationDataContext())
        {
            var result = context.gprefs.FirstOrDefault();
            if (result != null)
            {
                Host = result.cpopserver;
                Port = Convert.ToInt32(result.npopport);
            }
        }
    }
    catch (Exception e)
    {
        Logger.LogEvent("There was an error loading settings:n"   e);
    }
  

В таблице gprefs есть только одна строка, в которой хранятся системные настройки. Я остановился на первой строке этого в режиме отладки и подтвердил, что соединение равно нулю, а контекст не существует в начале метода. Я также подтвердил, что строка подключения указывает на правильную базу данных (DataBaseTestTwo).

В качестве теста я попытался заменить ConnectionString пустой строкой, и она все еще подключалась к DataBaseTestOne.

Когда я создавал DataContext, я извлек таблицы из DataBaseTestOne, но мне трудно поверить, что это означает, что я могу получить доступ только к этой одной базе данных.

Я надеюсь, что есть какая-то простая проблема, которую я упускаю из виду, но, похоже, я не могу ее найти.

Дополнительная информация

В классе, который обрабатывает работу с базой данных, я нашел параметр в разделе Свойства -> Настройки с именем DataBaseTestOne с текстом подключения к этой базе данных. Я попытался удалить это и получил ошибку в файле DbCommunication.designer.cs в строке ниже:

 public DbCommunicationDataContext() : 
        base(global::Utilities.Properties.Settings.Default.DataBaseTestOneConnectionString, mappingSource)
{
    OnCreated();
}
  

Эта ссылка существует потому, что именно оттуда я взял исходные таблицы, или я каким-то образом жестко запрограммировал эту базу данных при создании контекста? Держу пари, что я могу изменить свойство, чтобы указать на используемую базу данных, но я не помню, чтобы мне приходилось делать это в прошлом, когда я использовал Linq To Sql, плюс это оставило бы потенциальный пароль открытым текстом.

Комментарии:

1. Откройте файл конструктора контекста и щелкните правой кнопкой мыши -> просмотреть код. В новом файле частичного класса добавьте перегрузку к методу onCreated. Используйте это, чтобы загрузить правильную строку подключения из конфигурации и установить ее в свойство connections строка подключения. partial void OnCreated(){Connection.ConnectionString=ConfigurationManager.ConnectionStrings["myConn"].ConnectionString;}

Ответ №1:

Может быть глупо, и я бы добавил это в качестве комментария, если бы мог, но — проверьте, где определено подключение к базе данных? Очевидно, что это откуда-то тянет соединение. Файл конфигурации был бы очевидным местом для проверки.

РЕДАКТИРОВАТЬ: Иногда параметры конфигурации считываются только один раз, в самом начале. Возможно, вам потребуется перезапустить приложение, чтобы изменения вступили в силу. Мне приходилось делать подобные вещи раньше, и обычно с этим справлялся сброс IIS, все было бы повторно инициализировано.

Комментарии:

1. У меня была та же мысль, и хотя соединение открывается пару раз, чтобы получить настройки для различных плагинов, оно всегда закрыто, а SqlConnection всегда определяется на уровне метода. Я проверил, отображается ли имя DataBaseTestOne где-либо в коде, и нашел его в DbCommunication.dbml и DbCommunication.designer.cs вместе с парой других дизайнеров, и изучаю, может ли соединение быть получено из них где-нибудь.

2. также проверьте, кэшировано ли старое соединение в соответствии с моей правкой.

3. Я останавливал и запускал программу несколько раз. Кроме того, он был установлен на разных компьютерах, начиная с разных текстов подключения, но все равно возвращается к той же базе данных.

4. ну, думаю, единственное, что для этого нужно, — это старый добрый сеанс grep для всех файлов для определения соединения.

Ответ №2:

Проблема заключалась в том, что я никогда не связывал соединение с контекстом данных. Я изменил свой код, как показано ниже, и все начало работать.

         //using (SqlConnection connection = new SqlConnection(connectionString))
        using (DbCommunicationDataContext context = new DbCommunicationDataContext(connectionString))
        {
            var result = context.gprefs.FirstOrDefault();
            if (result != null)
            {
                wcf = result.cportlserver;
                resend = result.ndatsentaft.ToString();
            }
        }