У меня есть одна строка подключения в моем app.config. Я подключаюсь к базе данных настроек, чтобы получить дополнительные строки подключения. Я записываю эти дополнительные строки подключения в мой app.config во время выполнения. Кажется, что все работает, как и ожидалось, но Entity Framework, кажется, не замечает изменений и выдает исключение при попытке использовать одну из дополнительных строк подключения.
Шаги ниже:
- Чистый раствор.
- Debug
- [моя программа] .exe.Config копируется в bin / Debug с одной строкой подключения
- Entity Framework подключается к базе данных настроек и получает дополнительные строки подключения
- Обновить раздел connectionStrings в [моей программе] .exe.Config с помощью дополнительных строк подключения. Файл в bin / Debug определенно обновлен.
- Создание контекста Entity Framework для другой базы данных с использованием одной из дополнительных строк подключения из предыдущего шага
- Вызовите контекст. [Что угодно] .ToList () выдает исключение 'Значение не может быть нулевым. Имя параметра: соединение '
- context.Database.Connection имеет значение null, которое, как я полагаю, объясняет исключение?
Процесс завершается. Перезапустите debug без решения для очистки, чтобы строки подключения из предыдущего запуска все еще находились в [моей программе] .exe.Config. Entity Framework больше не выдает исключение. Исходя из этого, я считаю, что строки подключения действительны, но Entity Framework просто не видит их в первый раз.
Код
private void SetConnectionStrings()
{
var configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var section = (ConnectionStringsSection)configuration.GetSection("connectionStrings");
foreach (ConnectionStringSettings connectionString in ConfigurationManager.ConnectionStrings)
{
var newConnectionString = GetSetting(connectionString.Name);
if (!string.IsNullOrWhiteSpace(newConnectionString))
{
section.ConnectionStrings[connectionString.Name].ConnectionString = newConnectionString;
}
}
configuration.Save(ConfigurationSaveMode.Full);
ConfigurationManager.RefreshSection(configuration.ConnectionStrings.SectionInformation.Name);
}
GetSetting () просто получает строку подключения из базы данных настроек.
Мой app.config выглядит примерно так:
<connectionStrings>
<add name="SettingsContainer" connectionString="metadata=res://*/EntityFramework.ABC.csdl|res://*/EntityFramework.ABC.ssdl|res://*/EntityFramework.ABC.msl;provider=System.Data.SqlClient;provider connection string="data source=ASERVER;initial catalog=ABC;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="AdditionalEntityFrameworkModel" connectionString="" providerName="System.Data.EntityClient" /></connectionStrings>
Есть предложения? Все однопоточное. Единственное, о чем я могу думать, это то, что app.config загружается в память при запуске и вызывает Save (), а RefreshSection () не обновляет версию в памяти, а только файл на диске.