关于c#:将DbContext拆分为多个具有重叠DbSet的上下文

Splitting DbContext into multiple contexts with overlapping DbSets

我有一个 DbContext,目前包含 80 个实体,只完成了 4 个主要模块,但还有 3 个要完成,而且它们相当大,因此可以轻松达到 150 个。我认为现在是划分上下文的最佳时机。每个模块都使用它自己的实体并将获得它自己的上下文,但是所有模块都使用一组实体,所以这里是 mu 问题:

我是否应该有一个 MainContext 包含所有重叠的实体,但是:

  • FK 依赖关系会发生什么?
  • 嵌套 using (var db = new context) 会有多少性能问题,因为我需要从每个模块访问主上下文。

我应该把重叠的实体放在所有的上下文中,然后

  • 映射会发生什么,不是每个上下文都尝试映射它自己的实体并得到错误吗?
  • 我应该排除重叠上下文在除一个上下文之外的所有上下文上的映射吗?

我应该留在一个上下文中吗?

还有其他建议吗?


如果您需要使用跨越多个 DbContext 的事务,您将遇到问题。无论所有 DbContext 是否连接到同一个数据库,它都会被提升为分布式事务。这使事情变得非常缓慢。

您还将失去工作单元的好处,因为 DbContext 将独立跟踪它们的模型。

您仍然可以分离模型并复制共享模型。这不会导致各种 DbContext 破坏关系或死锁,不会超过两个人同时运行您的软件的两个副本。

但是,为了使事情易于管理,您可以保留在一个 DbContext 中,但隐藏每个模块中不需要的模型。

采取以下DbContext -

1
2
3
4
5
6
7
8
public class MyContext : DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<Vehicle> Cars { get; set; }
    public DbSet<Trip> Trips { get; set; }
    public DbSet<Company> Employers { get; set; }
    public DbSet<Employee> Employees { get; set; }
}

如果你想制作一个驾驶模块,你可能只会使用 People、Cars、


n