1

我使用 EF5 代码优先并在配置中设置我的初始化程序。我想在一个应用程序中使用多个相同上下文类型的数据库。我的连接字符串如下所示:

<add name="DatabaseProduction" connectionString="Server=localhost; Database=DatabaseProduction; User Id=***; password=***" providerName="System.Data.SqlClient"/>
<add name="DatabaseTest" connectionString="Server=localhost; Database=DatabaseTest; User Id=***; password=***" providerName="System.Data.SqlClient"/>

我可以像这样在代码中使用我的上下文

var _contextProd = new MyContext("DatabaseProduction");
var _contextTest = new MyContext("DatabaseTest");

设置数据库初始值设定项的常规方法是这里解释的配置文件。但据我了解,我可以在每个上下文的基础上设置初始化程序,但不能为每个连接字符串设置一个。错误的?

问题是:如何在生产数据库上设置例如DropCreateAllwaysInitializer测试CreateDatabaseIfNotExistsInitializer数据库?

============ 编辑回答格特的评论并澄清 ============

我通常定义我的初始化程序的方式是

<contexts>
  <context type=" Namespace.MyContext, MyAssembly">
    <databaseInitializer type="Namespace.MyCustomContextInitializer, MyAssembly" />
  </context>
</contexts>

我当然可以在这里添加第二个并为另一个上下文<context...>定义初始化程序。但是如何判断在哪个连接字符串中使用了哪个初始化器呢?换句话说,我的问题:

  1. 连接字符串不知道存在哪个上下文。
  2. 上下文(在上下文部分)不知道它链接到哪个连接字符串
  3. 在后面的代码中,我告诉上下文要使用哪个连接字符串
  4. 特定上下文的初始化器似乎对于每种上下文类型都是静态的。

同样,我如何为一对上下文和连接字符串定义一个特定的初始化程序?

4

1 回答 1

0

我能想到的唯一方法是为每个连接字符串派生一个上下文:

public class MyProductionContext : MyContext
{
  public MyProductionContext()
    : base( "DatabaseProduction" )
  {
  }
}

public class MyTestContext : MyContext
{
  public MyTestContext()
    : base( "DatabaseTest" )
  {
  }
}

然后,您可以为每个派生上下文设置初始化程序。

于 2012-12-10T08:37:57.540 回答