2012-04-14 10 views
5

Soy nuevo en EF4, y estoy tratando de encontrar la mejor manera de crear mi (s) clase (s) DbContext.¿Debería el DbContext de EF contener todas las tablas?

¿Hay algún problema (especialmente el rendimiento) en poner todas mis tablas/entidades en una y solo una clase DbContext, como el código siguiente?

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... 
} 

¿O debería modelar mis clases en función de los subconjuntos de funcionalidades?

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

Gracias

Respuesta

7

Si tiene sub-áreas que tienen la lógica de negocio específico, puede dividirlo en múltiples DbContext. (Estos contextos más pequeños siguen un patrón crítico para Domain Driven Design llamado Contextos delimitados). Hay una serie de beneficios para crear DbContexts que se dirigen a estos diversos procesos en lugar de un contexto de uso general . A medida que su aplicación crezca, será mucho más fácil mantener cada contexto y localizar la lógica que necesita dentro de él. (Mejor que agregar o modificar la lógica existente en el único DbContext con muchas propiedades DbSet y una configuración fluida para muchas clases)

El rendimiento es otra consideración. Cuando Entity Framework crea un modelo en memoria del contexto, cuanto mayor es el contexto, más recursos se gastan en generar y mantener ese modelo en memoria.

Si va a compartir instancias (Order) entre contextos múltiples, la entidad solo se puede adjuntar a un contexto a la vez. Primero separe el pedido del DbContext del cliente y adjunte el pedido a un DbContext del producto. Y debe tener cuidado con (o simplemente evitar) mover entidades agregadas, modificadas o eliminadas de un contexto a otro.

Order order; 
using (var custDb = new CustomerDb()){ 
    order = custDb.FirstOrDefault(o=>OrderId == "orderid"); 
} 
using (var prodDB = new ProductDb()){ 
    prodDB.Attach(order); 
    ... 
} 
+0

Bounded Contexts definitivamente puede ser una buena idea! Sin embargo, se puede ignorar el rendimiento alcanzado ... La creación del modelo lleva más tiempo, pero eso solo ocurre al inicio. Hay muchos trucos para mantenerlo lo más rápido posible. Más información en algunos videos: http://pluralsight.com/training/Courses/TableOfContents/efarchitecture – Jowen

Cuestiones relacionadas