我是EF4的新手,我正在尝试找出创建DbContext类的最佳方法。
将所有表格/实体放入一个且只有一个DbContext类中是否有任何问题(特别是性能),如下面的代码?
public class AllInOneDb : DbContext
{
public DbSet<Customer> Customers{ get; set; }
public DbSet<Address> Addresses{ get; set; }
public DbSet<Order> Order{ get; set; }
public DbSet<Product> Products{ get; set; }
public DbSet<Category> Categories{ get; set; }
// and more and more entities...
}
或者我应该根据功能的子集对我的类进行建模?
public class CustomerDb : DbContext
{
public DbSet<Customer> Customers{ get; set; }
public DbSet<Address> Addresses{ get; set; }
public DbSet<Order> Order{ get; set; }
}
public class ProductDb : DbContext
{
public DbSet<Product> Products{ get; set; }
public DbSet<Category> Categories{ get; set; }
public DbSet<Order> Order{ get; set; } // look Order entity again!
}
由于
答案 0 :(得分:7)
如果您的子区域具有特定的业务逻辑,则可以将其拆分为多个DbContext
。 (这些较小的上下文遵循对域驱动设计至关重要的模式
称为有界上下文)。创建针对这些不同进程的DbContexts有许多好处,而不是一个多用途
上下文。随着应用程序的增长,维护每个上下文以及在其中找到所需的逻辑将变得更加容易。 (优于在单个DbContext
中添加或修改现有逻辑,具有许多DbSet
属性和许多类的流畅配置
表现是另一个考虑因素。当Entity Framework创建内存时 上下文的模型,上下文越大,花费的资源就越多 生成并维护内存模型。
如果要在多个上下文之间共享实例(Order
),则实体一次只能附加到一个上下文。首先从Customer DbContext分离Order并将Order附加到Product DbContext。你应该小心(或者只是避免)将已添加,修改或删除的实体从一个上下文移动到另一个上下文。
Order order;
using (var custDb = new CustomerDb()){
order = custDb.FirstOrDefault(o=>OrderId == "orderid");
}
using (var prodDB = new ProductDb()){
prodDB.Attach(order);
...
}