Я настраиваю dev, qa, staging, production-систему развертывания.Я хотел бы иметь возможность продвигать выпуск из одной среды в другую без необходимости повторной публикации из VS и без ручного прикосновения к каким-либо файлам.
Это действительно странное и плохое требование.Абсолютно распространено перенастроить приложение во время развертывания в другой среде.Вместо жесткого кодирования этого в вашем приложении у вас должен быть другой набор сценариев установки / развертывания, которые также изменили бы ваш файл конфигурации при переходе из одной среды в другую.
Удержание конфигурации для всех сред в конфигурации, ИМХО, очень плохопрактика.
Даже с жестко запрограммированным решением вам все равно нужно изменить некоторую «конфигурацию», чтобы сообщить приложению, в какой среде оно работает.Жестко запрограммированное решение будет использовать информацию о среде, чтобы выбрать правильную строку соединений из файла конфигурации и передать ее в конструктор контекста.
В качестве примера упомянутого подхода вы можете попробовать это.Вам по-прежнему потребуется изменять переменную среды при каждом повторном развертывании приложения - сложность такого изменения в пользовательском сценарии развертывания точно такая же, как и при замене строки подключения:
Файл конфигурации:
<appSettings>
<add key="environment" value="Dev"/>
</appSettings>
<connectionStrings>
<add name="Dev" connectionString="..."/>
</connectionStrings>
Код для метода фабрики контекста:
public static YourContext ContextFactory()
{
string environment = WebConfigurationManager.AppSettings["environment"].Value;
// This should be correctly recognized as a name of connection string.
return new YourContext(environment);
}
Контекст:
public class YourContext : DbContext
{
public YourContext(string connectionStringName) : base(connectionStringName)
{ }
}