为什么必须在子上下文中将Database Initializer设置为null?

时间:2017-09-21 07:01:36

标签: c# entity-framework cqrs

我正在查看一些在线代码,其中有两个相同数据库的上下文(一个用于读取,一个用于写入):

public class OrderReadContext: DbContext
    {
      public OrderReadContext() : base("name=GeekStuffSales") {

      }
      public DbSet<SalesOrder> Orders { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
      modelBuilder.HasDefaultSchema("Order");
   }
  }
  public class OrderSystemContextConfig : DbConfiguration
  {
    public OrderSystemContextConfig() {
      SetDatabaseInitializer(new NullDatabaseInitializer<OrderReadContext>());
    }

  }

Ladislav Mrnkas&#39;回答这篇文章解释了初始化程序必须在子上下文中设置为null:Entity Framework: One Database, Multiple DbContexts. Is this a bad idea?

为什么必须在子上下文中将Database Initializer设置为null?

我尝试将种子方法添加到我的一个子上下文中,但是这会导致错误,说明存在未完成的迁移。这是不允许的吗?

1 个答案:

答案 0 :(得分:1)

实际上,您可以在同一个数据库中拥有所需的上下文(迁移历史记录表具有对上下文的引用)。
如果上下文共享表,则必须对迁移进行一些修复(EF尝试更多次创建同一个表)。这可能就是你需要禁用初始化程序的原因。

如果不是这种情况(表格重叠),你可以在这里看到一个样本,但你看不到任何有趣的东西,它只是有效。

https://github.com/bubibubi/JetEntityFrameworkProvider/tree/master/JetEntityFrameworkProvider.Test/Model37_2Contexts

在这种情况下,表格不重叠,因此我只使用标准初始化程序创建表格 这些是通过迁移历史记录表

运行的查询
insert into [__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
values ('201709210714271_InitialCreate', 'JetEntityFrameworkProvider.Test.Model37_2Contexts_1.Context1',  0x1F8B08000...and so on... , '6.1.3-40302');
insert into [__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
values ('201709210714279_InitialCreate', 'JetEntityFrameworkProvider.Test.Model37_2Contexts_2.Context2',  0x1F8B0...and so on... , '6.1.3-40302');