请参阅下面的代码,我从在线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错误说:“销售订单已存在”。
我理解这里发生了什么,即你不能两次创建同一个表。我只想创建一个数据库表,供这两个上下文使用。我该怎么做?
答案 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