7

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

谢谢

4

1 回答 1

7

如果您有具有特定业务逻辑的子区域,则可以将其拆分为多个DbContext. (这些较小的上下文遵循一种对领域驱动设计至关重要的模式,称为有界上下文)。创建针对这些不同进程而不是一个通用上下文的 DbContext 有许多好处。随着您的应用程序的增长,维护每个上下文以及在其中找到您需要的逻辑将会变得更加容易。(比添加或修改单个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);
   ...
}
于 2012-04-14T11:32:24.510 回答