2014-12-26 2 views
1

У меня есть 3 базы данных DBDev, DBStaging и DBProduction. В моем приложении я создал 3 edmx для каждой БД. Каждая БД имеет соответствующий объект следующим образом: DBDev -> DEVEntities, DBStaging -> StagingEntities или DBProduction -> ProductionEntitiesКак указать на Entity Framework DB Контекст для разных сред

выбрать, какой DB Я хочу получить доступ через это в web.config:

<connectionStrings configSource="Configs\DBDev.config" /> <!-- or DBStaging or DBProduction--> 

I проложите весь мой доступ к БД одному статическому классу: DBAccess. Когда мне нужно указать на конкретный контекст, я вручную сделать это:

private static DEVEntities db = new DEVEntities(); 

или

private static StagingEntities db = new StagingEntities(); 

или

private static ProductionEntities db = new ProductionEntities(); 

Что более умный способ указать на желаемом контексте без необходимости вручную его менять?

+0

Есть ли причина, по которой вы используете три разных edmx? Являются ли схемы разными? –

+0

Нет, они одинаковы. Я хотел использовать файлы конфигурации, потому что каждая среда имеет разные значения строки подключения: источник данных Начальный каталог user id пароль Я не знал, как это сделать, кроме как создать разные edmx. Если бы я только создал один edmx, как бы я мог бы отправлять значения этих разных значений? – user1019042

+0

И почему у вас есть статические контексты? Вероятность 99,9% - это плохая идея. –

ответ

4
  1. Создать три строки подключения в файле конфигурации, например, так:

    <connectionStrings> 
        <add name="DevConnection" connectionString="..." /> 
        <add name="StagingConnection" connectionString="..." /> 
        <add name="ProdConnection" connectionString="..." /> 
    </connectionStrings> 
    
  2. В вашем Entity Framework контекст класса, добавить конструктор, который принимает строку подключения в качестве параметра и вызывает соответствующую базу конструктор:

    public class MyEntities : ObjectContext // or DbContext 
    { 
        public MyEntities(string connectionString) : base(connectionString) {} 
    } 
    
  3. Проинтегрируйте контекст своей сущности, передав имя строки подключения. Можно также использовать контейнер инъекции зависимостей и настроить его, чтобы использовать правильное значение:

    var context = new MyEntities("DevConnection"); 
    
+0

Вам не кажется, что достаточно одной строки соединения (и одного класса контекста)? Все базы данных имеют одну и ту же схему. Строка подключения может быть изменена в соответствии с каждой средой. –

+0

@GertArnold вы говорите «одна строка соединения», но затем вы подтверждаете, что строка соединения должна быть «изменена» для разных данных («среда», как вы говорите.) Что вы предлагаете? Чем он отличается от того, что сделал Фрэнк? Или отличается от OP? –

+1

@TheRedPea В этом случае достаточно одного класса контекста и одного имени подключения * в файле конфигурации. Строка подключения * значение * может быть изменена для подключения к правой базе данных. Но вопрос был не совсем ясен. IIRC Я попытался зажечь дискуссию, чтобы получить больше ясности. –

0

Другое решение, которое более ALM соответствует:

  1. Создание установки

    <ConnectionStrings> < add name = "dbConnection" connectionString = "..." .../> </ConnectionStrings >

  2. В обозревателе решений разверните Web.config, и вы увидите Web.Debug.config и Web.Release.config

  3. Добавить в обоих

    <ConnectionStrings> < add name = "dbConnection" connectionString = "..." ... xdt: Transform = "SetAttributes" xdt: Locator = "Match (name)"/> </ConnectionStrings >

Вы можете добавить дополнительные Web.xxx.configs.Я пробовал и тестировал это для проекта Azure Cloud Service с несколькими конфигурациями для локального отладки, отладки, производства и т. Д., И он отлично работает. Если вы собираетесь создать веб-приложение Azure, это рекомендуемый способ развертывания новых версий, потому что, когда вы меняете свой код Staging/Production, он заменяет код, но не вашу конфигурацию.

Конечно, вы можете использовать это без Azure :) Это снова рекомендуемый способ, чтобы не потеряться в конфигурационном лесу.

Еще один бонус - вы можете щелкнуть правой кнопкой мыши по Web.xxx.config, а затем нажать «Предварительный просмотр», который не только даст вам предварительный просмотр, но и подтвердит вашу конфигурацию.

Смежные вопросы