2012-04-14 12 views
5

Sono nuovo di EF4 e sto cercando di capire il modo migliore per creare le mie classi DbContext.DbContext di EF contiene tutte le tabelle?

C'è qualche problema (specialmente prestazioni) nel mettere tutte le mie tabelle/entità in una sola classe di DbContext, come il codice qui sotto?

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

Oppure dovrei modellare le mie classi in base ai sottoinsiemi di funzionalità?

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

Grazie

risposta

7

Se si dispone di aree sub che hanno la logica di business specifico, è possibile dividerlo in più DbContext. (Questi contesti più piccoli seguono uno schema critico per il design basato su dominio denominato Contesti con limiti). Esistono numerosi vantaggi nella creazione di DbContexts destinati a questi diversi processi anziché a un contesto universale. Man mano che la tua applicazione cresce, sarà molto più semplice mantenere ogni contesto e individuare la logica necessaria al suo interno. (Meglio dell'aggiunta o modifica della logica esistente nel singolo con molte proprietà DbSet e configurazione fluente per molte classi)

Le prestazioni sono un'altra considerazione. Quando Entity Framework crea un modello in memoria del contesto, più grande è il contesto, maggiori sono le risorse spese per generare e mantenere tale modello in memoria.

Se si condividono istanze (Order) tra più contesti, Entità può essere associata a un solo contesto alla volta. Scollegare innanzitutto l'ordine dal cliente DbContext e allegare l'ordine a un prodotto DbContext. E dovresti stare attento (o semplicemente evitare) a spostare entità aggiunte, modificate o eliminate da un contesto a un altro.

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

Contesti limitati possono sicuramente essere una buona idea! Tuttavia, il successo in termini di prestazioni può essere ignorato ... La creazione del modello richiede più tempo, ma ciò avviene solo all'avvio. Ci sono molti trucchi per mantenerlo il più velocemente possibile. Maggiori informazioni in alcuni video: http://pluralsight.com/training/Courses/TableOfContents/efarchitecture – Jowen

Problemi correlati