2013-04-25 17 views
8

Quando si programma utilizzando LINQ con un file .dbml, esiste un solo contesto. Ma quando faccio un sito MVC, sembra di avere contesti separati per ogni entità (che è il modo in cui il tutorial MVC mi ha mostrato come farlo, con il contesto "film").Perché più classi DbContext?

ho:

public class AccountsContext : DbContext 
{ 
    public AccountsContext() 
     : base("DefaultConnection") 
    { 
    } 

    public DbSet<Account> Accounts { get; set; } 
} 

E, devo:

public class ClientsContext : DbContext 
{ 
    public ClientsContext() 
     : base("DefaultConnection") 
    { 
    } 

    public DbSet<Client> Clients { get; set; } 
} 

Quando chiamo questi, devo creare contesti separati, come:

private AccountsContext db = new AccountsContext(); 
private ClientsContext clientsContext = new ClientsContext(); 

... Il che è al tempo stesso fastidioso, e sembra ridondante poiché so che quando uso LINQ, devo solo istanziare un singolo oggetto di database.

C'è un modo per utilizzare solo un contesto? E questo è raccomandato?

risposta

12

Non ci dovrebbe essere nulla che ti impedisca di usare un contesto. Il database e gli strumenti utilizzati per accedervi devono essere completamente indipendenti da qualsiasi cosa al di fuori di essa (business logic, livello di servizio, interfaccia utente, ecc ...).

Il numero di contesti, o il modo in cui li si utilizza, non dovrebbe cambiare in base alla tecnologia del cliente.

Che dire di MVC ti porta a credere che avresti bisogno di più di un contesto? E cosa ti impedisce di farlo?

Se pensate di aver bisogno di usare un contesto per ogni entità, perché il campione era così, non lo fate. Basta usare un contesto.

Se aiuta, questo è ciò che un semplice contesto sembra con più di un'entità:

public partial class abook_dbEntities : DbContext 
{ 
    public abook_dbEntities() 
     : base("name=abook_dbEntities") 
    { 
    } 

    public DbSet<Entity> Entities { get; set; } 
    public DbSet<Contact> Contacts { get; set; } 
} 

Se aiuta, un tipico flusso di business si presenta così:

UI -> Controller -> Business logic -> Accesso ai dati -> Database

I tuoi contesti dati andrebbero nel tuo livello dati. La tua logica andrebbe nel tuo livello di logica aziendale.

+5

L'esempio MVC Movies utilizza specificamente e deliberatamente più di un contesto. http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/adding-a-model. Perché, non lo so. Forse solo per illustrare che è possibile farlo. Potrebbe essere una cosa desiderabile da fare per applicazioni molto grandi; è possibile creare un contesto per ciascun dipartimento di una società, o forse ogni database fisico. –

+0

Sai se c'era una buona ragione per quello? Quindi forse l'OP sta pensando che debba essere fatto in quel modo, a causa di quell'esempio? –

+0

Questa sarebbe la mia ipotesi. –