gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:06:40 24 4
gpt4 key购买 nike

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

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

  • FK 依赖项会怎样?
  • 嵌套 using (var db = new context) 会有多大的性能问题,因为我需要从每个模块访问主上下文。

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

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

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

还有什么建议吗?

最佳答案

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

您还将失去工作单元的优势,因为 DbContext 将独立跟踪其模型。

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

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

采用以下 DbContext -

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 和 Trips。如果您想要一个薪资模块,您可能只使用公司、员工和人员。所以你需要以下接口(interface):

public interface IDrivingContext
{
DbSet<Person> People { get; }
DbSet<Vehicle> Cars { get; }
DbSet<Trip> Trips { get; }
}

public interface IPayrollContext
{
DbSet<Person> People { get; }
DbSet<Company> Employers { get; }
DbSet<Employee> Employees { get; }
}

然后您更改上下文以实现两个接口(interface):

public class MyContext : DbContext, IDrivingContext, IPayrollContext
{
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> { get; set; }
}

当您使用 DbContext 时,只需将变量键入 IDrivingContextIPayrollContext,具体取决于您在哪个模块中编码:

using (IDrivingContext db = new MyDbContext())
{
// ...
}

using (IPayrollContext db = new MyDbContext())
{
// ...
}

关于c# - 将 DbContext 拆分为具有重叠 DbSet 的多个上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31087010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com