C# 如何跨上下文共享表?
请参阅下面的代码,这是我从在线CQRS教程中借用的: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(
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>());
}
}