Определите строку подключения в зависимости от среды при использовании Entity Framework - PullRequest
1 голос
/ 23 ноября 2011

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

Мне нужны отдельные базы данных для DEV, QA и STG / PROТаким образом, это будет означать, что строки подключения необходимо динамически переключать в соответствии с окружением.

Я мог бы сделать это на уровне данных - возможно, что-то похожее на это: Управление ASP.NET Development, StagingСтроки производственного соединения (без выдергивания волос) - но мой уровень данных построен на Entity Framework.

ВОПРОС: Есть ли способ добиться динамического переключения строк соединения?при использовании Entity Framework?

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Я настраиваю 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)
    { }
}
0 голосов
/ 23 ноября 2011

Предполагается, что вы используете единицу работы шаблона;это означает, что контекст вашего объекта воссоздается после каждой единицы работы.Вероятно, у вас есть класс, который наследуется от какого-то контекста объекта, поэтому в конструкторе, который вы используете для создания этого контекста, вы можете ссылаться на базовый конструктор, который позволяет передавать строку соединения.Оттуда вы можете вызвать статический метод или создать новый объект для обработки создания строки соединения или передать соединение сущности.

Если вы используете DbContext, это то же самое, толькос DbConnection вместо EntityConnection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...