如果您需要使用跨越多个 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。如果您想要一个工资单模块,您可能只使用 Company、Employee 和 People。所以你需要以下接口:
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; }
}
然后你改变你的上下文来实现这两个接口:
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 时,只需将变量键入IDrivingContext 或IPayrollContext,具体取决于您在哪个模块中编码:
using (IDrivingContext db = new MyDbContext())
{
// ...
}
using (IPayrollContext db = new MyDbContext())
{
// ...
}