首页 > 解决方案 > 一个数据库和多个数据库中的多个上下文之间的区别

问题描述

我正在使用 DDD 进行开发,因此我需要为每个有界上下文创建一个上下文。

对于整体设计,我有两种选择:

  1. 每个上下文创建一个数据库。
  2. 为所有上下文创建一个数据库。

对于第一种方法,我对每个上下文使用不同的连接字符串(不同的数据库)。对于第二种方法,我使用相同的连接字符串,但每个上下文使用不同的模式。

我看过 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);
        }
    }
}

标签: c#entity-framework-coredomain-driven-design

解决方案


据我了解您的设置,这两种方法之间没有逻辑上的差异,这意味着您最终将获得不同的数据存储篮和目录数据。

我相信 Julie 在她的 DDD 课程中解释的是使用单独的 EF 上下文来为应用程序的不同部分(即有界上下文)建模和访问数据,在您的示例中是 Catalog 和 Basked。物理上独立的上下文允许您根据需要在两个域(目录和篮子)之间以不同方式声明产品实体(即仅相关属性)。


推荐阅读