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

Why must the Database Initializer be set to null in a sub context?

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

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 对此 post 的回答解释了必须在子上下文中将初始化程序设置为 null:Entity Framework: One Database, Multiple DbContexts. Is this a bad idea?

为什么必须在子上下文中将数据库初始化程序设置为空?

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

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

如果这不是你的情况(tables 重叠),你可以在这里看到一个示例,但你不会看到任何有趣的东西,它只是有效。

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

在这种情况下,table 没有重叠,所以我只使用标准初始化程序创建 table。
这些是针对迁移历史运行的查询 table

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');