2011-11-07 8 views
5

Ho un database SqlServer Compact Edition che contiene 2 tabelle.Posso avere 2 diversi contesti EntityFramework che condividono un singolo database SqlServer Compact?

Per ciascuna di queste tabelle, ho una classe di contesto derivata da DbContext che viene utilizzata dall'applicazione per accedere alla tabella.

Per mantenere i diversi componenti dell'applicazione disaccoppiati, non posso avere una classe di contesto che abbia le proprietà DbSet per entrambe le tabelle. Piuttosto, ho bisogno di avere 2 diverse classi di contesto, ognuna di esse deve essere completamente inconsapevole dell'altro e dei suoi dati.

Sto utilizzando l'approccio code-first, il mio codice definisce entità e modello e ho lasciato che Entity Framework creasse il database per me.

Il mio problema è: come posso ancora consentire a Entity Framework di creare automaticamente il database e le tabelle per l'inizializzazione del contesto, ma i contesti 2 condividono lo stesso database e la stessa connessione?

In questo momento ciò che ottengo è il primo contesto crea correttamente il database e la tabella in essa, ma quando cerco di creare il secondo contesto, io sono sempre, non sorprende il seguente errore:

The model backing the 'SomeObjectContext' context has changed since the database 
was created. Either manually delete/update the database, or call Database.SetInitializer 
with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges 
strategy will automatically delete and recreate the database, and optionally seed it with 
new data. 

Nessuno degli IDatabaseInitializer disponibili è appropriato per me, perché non desidero che l'intero database venga eliminato quando viene creato il secondo contesto. Voglio solo la tabella del secondo contesto da creare nel database esistente.

Qualsiasi consiglio su come risolvere questo sarebbe apprezzato.

Grazie

risposta

5

Non è possibile utilizzare CodeFirst questo modo con un solo database. CodeFirst deve controllare le classi del modello in modo che la struttura db funzioni correttamente (devono essere "sincronizzati").

In order to keep the different components of the application decoupled, I can't have one context class that would have DbSet properties for both of the tables. Rather, I need to have 2 different context class, each of them has to be completely unaware of the other and its data.

Se le tabelle della cabina non hanno collegamenti con l'altro e la sua un requisito per l'applicazione per avere queste tabelle completamente separati, perché non si fa a creare due database e hanno un contesto per ciascuno di essi?

A tutti, vorrei andare con un database, avere un interno DbContext e due diverse classi di repository pubblico che incapsulano l'accesso alle due tabelle. Se tutto il codice è all'interno dello stesso assembly, è possibile accedere al contesto interno dalla classe del repository. Qualcuno che ha bisogno di accedere al repository può accedere al repository per la tabella di cui ha bisogno.

+2

Diventa problematico in ambiente come Sql Azure dove ti viene addebitato il costo per database ... – Clement

2

Sì, è possibile utilizzare più contesto DB indirizzato allo stesso DB.

Arthur Vickers del team Entity Framework raccomanda lo schema seguente ....

Invece di specificare stringhe di connessione separate nel file app.config per più contesti, è sufficiente impostare una stringa e assegnargli un nome generico.

<connectionStrings> 
     <add name="MyDBContext" connectionString="Your conn string here" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

quindi creare una classe di contesto di base che utilizzerà la stringa di connessione:

using System.Data.Entity; 

namespace DataLayer 
{ 
    public class BaseContext<TContext> : DbContext where TContext : DbContext 
    { 
     static BaseContext() 
     { 
      Database.SetInitializer<TContext>(null); 
     } 
     protected BaseContext() 
      : base("name=MyDBContext") 
     { 
     } 

    } 
} 

Ora, ereditano questo comportamento base in ogni contesto (per esempio):

namespace DataLayer.Models 

    { 
     public class OrderContext : BaseContext<OrderContext> 

    … 

    namespace DataLayer.Models 
    { 
     public class ProductContext : BaseContext<ProductContext> 
    … 
+0

Grazie per aver risposto. La mia domanda riguardava specificamente un database SqlServer CE e ritengo che l'approccio che descrivi nella risposta non risolva il problema che ho riscontrato. Il problema riguardava in particolare il modo in cui il codice è stato utilizzato e CE ha funzionato. – Ran

+0

Mi dispiace Ran. Potrebbe aver frainteso la tua domanda .... – tom33pr

Problemi correlati