#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();
}
}