如何在Contexts上共享表格?

时间:2017-09-21 21:24:38

标签: c# entity-framework domain-driven-design cqrs

请参阅下面的代码,我从在线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>());
    }

  }

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

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.HasDefaultSchema("Order");
      modelBuilder.Entity<SalesOrder>().Ignore(s => s.LineItems);
    }
  }

  public class OrderSystemContextConfig : DbConfiguration
  {
    public OrderSystemContextConfig()
    {
      SetDatabaseInitializer(new NullDatabaseInitializer<OrderWriteContext>());
    }
  }

如果我先使用OrderReadContext,例如通过使用GetByID,OrderWriteContext在第一次使用时出错:“销售订单已存在”。如果我先使用OrderWriteContext,例如通过使用InsertSalesOrder,第一次使用时,OrderReadContext错误说:“销售订单已存在”。

我理解这里发生了什么,即你不能两次创建同一个表。我只想创建一个数据库表,供这两个上下文使用。我该怎么做?

2 个答案:

答案 0 :(得分:2)

鉴于此问题标有CQRS和域驱动设计,我将从这个角度回答。在典型的CQRS应用程序中,读写数据库是分开的。即使它们位于同一个数据库实例中,表也是分开的。这是因为读写侧模式可能不同,并且会在应用程序的生命周期内发生变化。

如果是这种情况,你会完全回避这个问题。

如果您发现它有用,此图表和说明为典型的CQRS应用程序提供了合理的概念架构。 CQRS + Event Sourcing – A Step by Step Overview

我希望你觉得这很有用。

答案 1 :(得分:0)

分别为两个上下文运行迁移(和update-database)。以下是如何使用多个上下文的示例:http://www.dotnettricks.com/learn/entityframework/entity-framework-6-code-first-migrations-with-multiple-data-contexts