EF的DbContext是否应包含所有表格?

时间:2012-04-14 02:02:36

标签: entity-framework dbcontext

我是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!
}

由于

1 个答案:

答案 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);
   ...
}