Изменение app.config во время выполнения сбивает с толку Entity Framework - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть одна строка подключения в моем 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=&quot;data source=ASERVER;initial catalog=ABC;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

<add name="AdditionalEntityFrameworkModel" connectionString="" providerName="System.Data.EntityClient" /></connectionStrings>

Есть предложения? Все однопоточное. Единственное, о чем я могу думать, это то, что app.config загружается в память при запуске и вызывает Save (), а RefreshSection () не обновляет версию в памяти, а только файл на диске.

...