【问题标题】:How to point to Entity Framework DB Context for different environments如何指向不同环境的实体框架数据库上下文
【发布时间】:2015-02-23 23:43:03
【问题描述】:

我有 3 个数据库 DBDev、DBStaging 和 DBProduction。在我的应用程序中,我为每个数据库创建了 3 个 edmx。每个数据库都有一个匹配的实体,如下所示: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();

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

【问题讨论】:

  • 您使用三种不同的 edmx 有什么原因吗?架构不同吗?
  • 不,它们是一样的。我想使用配置文件,因为每个环境都有不同的连接字符串值: 数据源 Initial Catalog 用户 ID 密码 除了创建不同的 edmx 之外,我不知道该怎么做。如果我应该只创建一个 edmx,我将如何发送这些不同值的值?
  • 为什么你有静态上下文?这是一个坏主意的可能性为 99.9%。

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


【解决方案1】:
  1. 在您的配置文件中创建三个不同的连接字符串,如下所示:

    <connectionStrings>
      <add name="DevConnection" connectionString="..." />
      <add name="StagingConnection" connectionString="..." />
      <add name="ProdConnection" connectionString="..." />
    </connectionStrings>
    
  2. 在您的实体框架上下文类中,添加一个以连接字符串作为参数并调用相应基础构造函数的构造函数:

    public class MyEntities : ObjectContext // or DbContext
    {
        public MyEntities(string connectionString) : base(connectionString) {}
    }
    
  3. 通过传递连接字符串的名称来实例化您的实体上下文。您还可以使用依赖注入容器并将其配置为使用正确的值:

    var context = new MyEntities("DevConnection");
    

【讨论】:

  • 你不认为 一个 连接字符串(和一个上下文类)就足够了吗?所有数据库都具有相同的架构。可以根据每个环境修改连接字符串。
  • @GertArnold 你说“一个连接字符串”,但是你承认连接字符串需要为不同的数据库“修改”(你说的“环境”。)你建议什么?它和弗兰克做的有什么不同?还是与 OP 不同?
  • @TheRedPea 配置文件中的一个上下文类和一个命名连接 entry 在这里就足够了。可以更改连接字符串 value 以连接到正确的数据库。但问题根本不清楚。 IIRC 我试图引发一些讨论以获得更清晰的信息。
  • 啊,一个上下文,一个配置;但是当您将应用部署到环境 {1} 时,请将配置更改为指向 {1} ?
  • 如果我要做这样的事情,我会设置要在 AppSettings 变量中使用的连接字符串。 然后我会调用第 3 步: var context = new MyEntities(ConfigurationManager.AppSettings["dbConnection"]);
【解决方案2】:

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

  1. 创建设置

  2. 在解决方案资源管理器中展开 Web.config,您将看到 Web.Debug.config 和 Web.Release.config

  3. 同时添加

您可以添加额外的 Web.xxx.configs。我已经针对 Azure 云服务项目进行了尝试和测试,该项目具有用于本地调试、暂存调试、生产等的多种配置,并且运行良好。如果您要制作 Azure Web 应用程序,这是推出新版本的推荐方式,因为当您交换暂存/生产代码时,它会交换代码但不会交换您的配置。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 2018-08-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2021-05-19
    相关资源
    最近更新 更多