如何指向不同环境的Entity Framework DB Context

时间:2014-12-26 19:05:06

标签: c# entity-framework model-view-controller

我有3个数据库DBDev,DBStaging和DBProduction。在我的应用程序内部,我为每个数据库创建了3个edmx。每个DB都有一个匹配的实体,如下所示:DBDev - > DEVEntities,DBStaging - > StagingEntities或DBProduction - > ProductionEntities

我在web.config中选择我想要访问的数据库:

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

我将我的所有数据库访问路由到一个静态类:DBAccess。当我需要指向特定的上下文时,我手动执行此操作:

private static DEVEntities db = new DEVEntities();

private static StagingEntities db = new StagingEntities();

private static ProductionEntities db = new ProductionEntities();

什么是更智能的方式来指向所需的上下文而无需手动更改它?

2 个答案:

答案 0 :(得分:5)

  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");
    

答案 1 :(得分:1)

另一个符合ALM条件的解决方案:

  1. 创建设置

    &LT;&的ConnectionStrings GT;   &lt; add name =&#34; dbConnection&#34;的connectionString =&#34; ...&#34; ... /&gt; &LT; /&的ConnectionStrings GT;

  2. 在Solution Explorer中展开Web.config,您将看到Web.Debug.config和Web.Release.config

  3. 添加到

    &LT;&的ConnectionStrings GT;     &lt; add name =&#34; dbConnection&#34;的connectionString =&#34; ...&#34; ...       XDT:变换=&#34; SetAttributes&#34; XDT:定位=&#34;匹配(名称)&#34; /&GT; &LT; /&的ConnectionStrings GT;

  4. 您可以添加其他Web.xxx.configs。我已经尝试并测试了这个Azure Cloud Service项目,其中包含多个用于本地调试,暂存调试,生产等的配置,并且它工作正常。如果您要创建Azure Web应用程序,这是推出新版本的推荐方法,因为当您交换Staging / Production代码时,它将交换代码而不是您的配置。

    当然你可以在没有Azure的情况下使用它:)这也是推荐的方式,以免在配置林中丢失。

    另一个好处是,您可以右键单击Web.xxx.config,然后单击“预览转换”&#39;这不仅可以为您提供预览,还可以验证您的配置。