C# 如何跨上下文共享表?

C# 如何跨上下文共享表?,c#,entity-framework,domain-driven-design,cqrs,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(

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

  }
公共类OrderReadContext:DbContext { public OrderReadContext():base(“name=GeekStuffSales”){ } 公共数据库集命令{get;set;} 模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder){ modelBuilder.hasdaultschema(“订单”); } } 公共类OrderSystemContextConfig:DbConfiguration { public OrderSystemContextConfig(){ SetDatabaseInitializer(新的NullDatabaseInitializer()); } } 以及:

公共类OrderWriteContext:DbContext { public OrderWriteContext():base(“name=GeekStuffSales”) { } 公共数据库集命令{get;set;} 公共数据库集行项目{get;set;} 模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder) { modelBuilder.hasdaultschema(“订单”); modelBuilder.Entity().Ignore(s=>s.LineItems); } } 公共类OrderSystemContextConfig:DbConfiguration { public OrderSystemContextConfig() { SetDatabaseInitializer(新的NullDatabaseInitializer()); } } 如果我首先使用OrderReadContext,例如通过使用GetByID,则OrderWriteContext在第一次使用时会出现错误,表示“销售订单已存在”。如果我首先使用OrderWriteContext,例如通过使用InsertSalesOrder,则OrderReadContext在第一次使用时会出现错误,表示“销售订单已存在”


我理解这里发生的事情,即不能创建同一个表两次。我只想创建一个数据库表供这两个上下文使用。如何做到这一点?

分别为两种上下文运行迁移(和更新数据库)。下面是一个如何处理多个上下文的示例:

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

如果是这样的话,你会完全回避这个问题

如果您觉得有用,此图和说明为典型的CQRS应用程序提供了合理的概念架构


我希望这对你有用。

谢谢。我听到了你对这个+1的看法。但是,如何使用两个localdbs测试CQRS应用程序?例如,如果将记录插入写入数据库,则在读取数据库中找不到记录,因为未设置复制。我不会使用复制,因为这两个数据库可能不同。读取端可能会被非规范化,并专注于读取速度。域数据库甚至可能不在表中。关于测试:您可以从读取端分别测试域元素。您可以创建集成测试,但这需要比我在这里解释的更多的空间。我的计划是使用SQL Server进行写操作,使用NoSQL进行读操作。但是,为了进行测试,我将有两个本地数据库,它们是SQL Server。按照目前的情况(使用您的方法),我将把信息输入到写数据库中,而它将无法从读数据库中进行选择。这有意义吗?有没有更好的方法来使用localdbS进行测试?DynamoDB/MongoDB是否有localdb等价物?
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>());
    }
  }