c# - 一个数据库和多个数据库中的多个上下文之间的区别
问题描述
我正在使用 DDD 进行开发,因此我需要为每个有界上下文创建一个上下文。
对于整体设计,我有两种选择:
- 每个上下文创建一个数据库。
- 为所有上下文创建一个数据库。
对于第一种方法,我对每个上下文使用不同的连接字符串(不同的数据库)。对于第二种方法,我使用相同的连接字符串,但每个上下文使用不同的模式。
我看过 Julie Lerman 的视频,阅读 StackOverflow 并使用第二种方法使用 EF Core 编写了一个演示,但我不明白第一种和第二种方法之间的真正区别。
我的数据库截图
我的演示代码:
目录上下文
namespace Catalog
{
public class CatalogContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
public CatalogContext(DbContextOptions options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("CatalogSchema");
base.OnModelCreating(modelBuilder);
}
}
public class CatalogContextFactory : IDesignTimeDbContextFactory<CatalogContext>
{
public CatalogContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<CatalogContext>();
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=TestingDddDatabase;Trusted_Connection=True;");
return new CatalogContext(optionsBuilder.Options);
}
}
}
篮子上下文
namespace Basket
{
public class BasketContext : DbContext
{
public DbSet<Product> Products { get; set; }
public BasketContext(DbContextOptions options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("BasketSchema");
base.OnModelCreating(modelBuilder);
}
}
public class CatalogContextFactory : IDesignTimeDbContextFactory<BasketContext>
{
public BasketContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<BasketContext>();
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=TestingDddDatabase;Trusted_Connection=True;");
return new BasketContext(optionsBuilder.Options);
}
}
}
解决方案
据我了解您的设置,这两种方法之间没有逻辑上的差异,这意味着您最终将获得不同的数据存储篮和目录数据。
我相信 Julie 在她的 DDD 课程中解释的是使用单独的 EF 上下文来为应用程序的不同部分(即有界上下文)建模和访问数据,在您的示例中是 Catalog 和 Basked。物理上独立的上下文允许您根据需要在两个域(目录和篮子)之间以不同方式声明产品实体(即仅相关属性)。
推荐阅读
- python - 如何在熊猫数据框中重新采样并忽略周末
- python - Dash plotly 在计算之间更新标签
- node.js - Socket.io 或 node js 中是否有函数可以观察 API 输出的变化?
- sql - 驱动将 uint64 参数转换为 int32 负值
- c++ - C++ gRPC TCP错误协议不可用
- c# - 无法使用自动映射器从链接表中获取数据
- sql - Oracle查询以获取同一表中具有重复列集的所有行
- c# - 如何在 C# 中使用 Rijndael 加密参数?
- python - python安装问题(app Dash & WSGI server)
- visual-studio - 是否可以运行已经构建的容器而不是创建构建的容器?