为相同上下文的不同连接字符串设置不同的初始化程序

时间:2012-12-09 14:12:11

标签: entity-framework ef-code-first connection-string entity-framework-5

我首先使用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");

设置数据库初始化程序的常规方法是配置文件,如here所述。但据我所知,我可以在每个上下文的基础上设置初始化程序,但不能为每个连接字符串设置初始化程序。错?

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

============编辑回答Gert的评论和澄清============

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

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

我可以肯定在这里添加第二个<context...>并为另一个上下文定义初始值设定项。但是如何判断哪个连接字符串使用哪个初始值设定项?换句话说,我的问题是:

  1. 连接字符串不知道有哪个上下文。
  2. 上下文(在上下文部分中)不知道它链接的连接字符串
  3. 在后面的代码中,我告诉上下文使用哪个连接字符串
  4. 特定上下文的初始化程序似乎对每种上下文类型都是静态的。
  5. 同样,我如何为上下文和连接字符串定义特定的初始值设定项?

1 个答案:

答案 0 :(得分:0)

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

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

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

然后,您可以为每个派生的上下文设置初始值设定项。