【问题标题】:.net core 2.1 multiple DbContext for same database.net core 2.1 同一数据库的多个 DbContext
【发布时间】:2021-08-12 06:30:24
【问题描述】:

我正在使用 .Net core 2.1 + EF Core 来构建 WebApi。基于此讨论:Entity Framework: One Database, Multiple DbContexts. Is this a bad idea? 和来自 DDD 的有界上下文概念我想为我的应用程序中的不同功能创建多个 DbContext。 Julie Lerman 在 PluralSight.com 上提供了一些资源,但其中不包括 .net core 中的依赖注入。到目前为止,我做了这样的事情:

var connectionString = Configuration.GetConnectionString("DatabaseName");

services.AddDbContext<DatabaseContext>(options =>
    options.UseSqlServer(connectionString, optionsBuilder =>
        optionsBuilder.MigrationsAssembly("Database.Migrations")));
services.AddDbContext<ProductContext>(options =>
    options.UseSqlServer(connectionString));
services.AddDbContext<CountryContext>(options =>
    options.UseSqlServer(connectionString));

这里 DatabaseContext 是用于 EF Core 迁移的上下文(实际上并不查询数据),ProductContextCountryContext 是我用于数据操作的两个上下文。我的问题是:

  • 这是正确的做法吗?重复使用相同的连接字符串感觉有点奇怪
  • 感觉就像我将使用 2 个单独的连接(并且这种连接会增加),这是否会导致将来出现一些数据访问问题、锁定、并发性等?

更新(2020-01-09)

我已经使用它一年多了。到目前为止没有任何与数据库连接相关的问题。也计划在未来的项目中使用这种方法。

【问题讨论】:

    标签: entity-framework entity-framework-core dbcontext asp.net-core-2.1


    【解决方案1】:

    有界上下文的概念本身就很好。它基于特定应用程序不应访问它不需要的东西的想法。就个人而言,我认为这有点矫枉过正,但理性的人可能会在这个问题上持不同意见。

    但是,您在这里所拥有的完全是错误的。如果您的应用程序需要访问所有这些有界上下文,那么拥有它们是没有意义的。只需为其提供所需的所有访问权限即可。是的,每个上下文都有一个单独的连接,所以是的,您可能在播放服务请求中有多个连接。同样,这就是为什么在这种情况下划分你的上下文是没有意义的。

    但是,如果您要采用微服务架构方法,其中每个微服务处理一个谨慎的功能单元,并且您想成为一个纯粹主义者,那么使用有界上下文将是有意义的,但在单体应用程序中则不然。

    【讨论】:

    • 以上是一个例子,也是项目的早期阶段,但要求是面向微服务架构,因此我正在尝试采用这种方法。
    • 嗯,微服务方法否定了您的两个问题:1)您不是“重用相同的连接字符串”,因为每个服务只有一个上下文。 2) 你不会有多个连接,因为同样,每个服务都只有一个上下文。
    • 如果一个微服务需要多个有界上下文,它要么不是真正的微服务,要么你的上下文没有适当地有界。
    • 我不同意“你所拥有的,完全是错误的”没有错。单体应用程序没有错,微服务架构也有它的批评者。微服务和 DDD 有界上下文都是为了解决试图在大域中维护统一模型的问题,但并不等同。
    • 我从来没有说过单体是错误的。然而,在一个单一的应用程序中使用多个有界上下文是错误的。没有意义,因为应用程序可以访问所有无论如何。你所做的只是需要更多的数据库连接到同一个数据库。有界上下文只有在应用程序的域也有界时才有意义。
    【解决方案2】:

    只需针对每个上下文执行此操作:

            services.AddScoped<YourContext>(s =>
            {
                var builder = new 
                DbContextOptionsBuilder().UseSqlServer("ConnectionString");
                return new YourContext(builder.Options);
            });
    

    【讨论】:

      猜你喜欢
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多