【问题标题】:How to switch between test and production databases with Entity Framework 5如何使用 Entity Framework 5 在测试和生产数据库之间切换
【发布时间】:2014-04-21 16:12:11
【问题描述】:

我的 ASP.NET MVC 4 应用程序有单独的测试和生产数据库。使用 Entity Framework 5,如何以编程方式在这两个数据库之间切换 Entity Framework?应用程序知道什么时候应该使用哪个数据库,所以我只需要让应用程序能够更改实体框架,以便它在正确的时间使用正确的数据库。

任何人都知道如何做到这一点和/或有一个很好的例子吗?


编辑:由于我的应用程序的排列方式,我需要利用 GvM 的答案。然而,最后剩下的事情是我不知道如何向基类发送参数。这就是我的意思:

public class YourContext : DbContext {

    public YourContext() : base("yourNameOrConnectionString")
    {
    }

}

问题是这段代码不起作用:

string dbConnectionString = "MyDBTest";

using (var db = new YourContext(dbConnectionString))
{
    //code to use the db
}

如何将参数发送到基类,在本例中为 YourContext() : base()

【问题讨论】:

    标签: asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5


    【解决方案1】:

    使用配置转换。这就是他们的目的。但是,不可否认,配置转换有点令人困惑,因为调试器实际上并没有使用它们。让我详细说明。

    默认情况下,您会获得三个 web.config:Web.configWeb.Debug.configWeb.Release.config。后两者在解决方案资源管理器中与第一个结合在一起,但您可以展开 Web.config 来查看它们。 Web.Debug.configWeb.Release.config 是转换。它们使用特殊的 XML 样式语法来允许您更改或 transformWeb.config 文件中的设置。每一个对应一个“Configuration”,即“Debug”和“Release”,这两个默认内置在Visual Studio中。您可以根据需要添加其他配置。

    现在,这就是令人困惑的地方。 Debug 配置,尽管它的名字,在调试时从未实际使用过。一个更好的名字可能是DevelopmentStaging;当您以测试能力而不是生产方式部署站点时,这是用于配置的配置。 Release 配置用于生产。因此,您需要在您的主要Web.config 中指定本地开发数据库的连接字符串。然后,在DebugRelease 配置中,添加一个转换以分别将其更改为登台/生产数据库连接字符串。当您在本地调试时,将使用主要的web.config,然后当您发布应用程序时,您将根据要部署的环境选择使用DebugRelease到,然后将运行转换以适当地更改已发布的web.config

    有关转换及其编写方法的更多信息,请参阅:http://msdn.microsoft.com/en-us/library/dd465326(v=vs.110).aspx

    【讨论】:

      【解决方案2】:

      将您的连接名称或连接字符串提供给 DbContext 构造函数。

      public class YourContext : DbContext {
      
          public YourContext(string connection) : base(connection)
          {
          }
      
      }
      

      字符串可以是您的应用程序根据您要连接的数据库修改的变量。

      编辑: 更新了示例,现在您有了一个接受字符串参数的构造函数,然后在实例化时将其传递给基类。

      【讨论】:

      • 谢谢,但是如何在 .Context.cs 类中更改设置为此方法的名称?基本上,我不知道如何以编程方式将“yourNameOrConnectionString”更改为“MyDBProd”或“MyDBTest”。
      • 提出这个问题的另一种方式:如何使用来自 Web.config 的不同连接字符串来实例化上下文。这是我遇到问题的地方: using (var db = new MyContext("MyDBTest")) 我的假设是我可以在这里输入任何连接字符串的名称,但这不起作用。我收到一条错误消息,指出没有接受 1 个参数的上下文的构造函数。我不明白如何将参数传递给此构造函数并将其传递给 base() 类(如您的示例中所示)。如何用我的通话中的 var 替换“yourNameOrConnectionString”?
      • 更新了示例,以便您可以将参数传递给派生的上下文类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多