2013-07-30 16 views
24

Sto scrivendo un sistema di gestione stipendi che si integrerà con un sistema preesistente. Il sistema originale aveva un database master che gestiva la gestione degli utenti e alcune configurazioni globali, al di sotto del numero di database identici per struttura, fondamentalmente ogni database è un database delle paghe delle aziende, tutti questi sono legati al database principale perché appartiene a un genitore società che ha molte filiali ciascuna con il proprio reparto risorse umane.Utilizzo di framework entità su più database

Quello che mi chiedevo è se c'è un modo che posso, basato su un cookie o un altro metodo che memorizza a quale azienda si desidera connettersi, modificare dinamicamente il database di destinazione dei framework di entità in base al loro input utilizzando un filtro ?

Ecco un esempio:

utente A accede al sito, caricamento della pagina con le aziende disponibili che l'utente ha il permesso di accesso, l'utente sarà quindi selezionare una società, che hanno privilegi di amministratore in tale società, aggiungono un dipendente, prima che l'azione venga eseguita, asp.net cambierà la stringa di connessione nel database appropriato, quindi aggiungerà il record.

+0

Al massimo si finisce con 2 contesti, o ci sono alcune soluzioni ma molto meno pratico e EF6 si prevede di supportare più Banca dati. Puoi verificare la versione beta, nel momento in cui la tua app sarà pronta, verrà rilasciato EF6. Ma tutti i DB fanno parte di un'organizzazione, quindi unendoli con una chiave esterna aggiuntiva per CompanyID creerà un DB e renderà più semplici i rapporti. –

+1

Ah, vedo, il problema è che la persona che ha creato il primo sistema di gestione stipendi è molto risoluto sul fatto che manteniamo la struttura del database la stessa, dice che è così che le aziende saranno più disposte ad aggiornare a una versione più recente se non lo fanno " t necessario eseguire migrazioni di database. – ChaoticLoki

+0

Beh, è ​​un incubo di manutenzione, non sarai in grado di eseguire query db incrociate con join. Non sono sicuro di EF6 ma puoi controllare su codeplex. –

risposta

5

EF6 offre un supporto migliore per l'accesso a più DB dallo stesso contesto. Ecco un frammento di EF5. La gestione delle impostazioni di inizializzazione del database è importante. Non si può voler attivare QUALSIASI migrazione. cioè, utilizzare questo prima

Database.SetInitializer(new ContextInitializerNone<MyDbContext>());

ma di rispondere alla domanda: Sì, è possibile

var conn = GetSqlConn4DbName(dataSource,dbName); 
var ctx = new MyDbContext(conn,true); 



public DbConnection GetSqlConn4DbName(string dataSource, string dbName) { 
     var sqlConnStringBuilder = new SqlConnectionStringBuilder(); 
     sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource; 
     sqlConnStringBuilder.IntegratedSecurity = true; 
     sqlConnStringBuilder.MultipleActiveResultSets = true; 

     var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString); 
     var sqlConn = sqlConnFact.CreateConnection(dbName); 
     return sqlConn; 
    } 


public class ContextInitializerNone<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext 
{ 
    public void InitializeDatabase(TContext context) { } 
} 

Also see StackOverflow answer using migration, sample code, and dynamic db connection

22

E 'molto semplice. Ho:

public WMSEntities() : base("name=WMSEntities") //WMSEntities is conection string name in  web.config also the name of Entitiframework 
{ 
} 

già Model.Context.cs generati automaticamente su cartella edmx

connettersi al database multiplo in fase di esecuzione, ho creato un altro costruttore che prende stringa di connessione come parametro, come di seguito nella stessa Modello di file. Context.cs

public WMSEntities(string connStringName) 
    : base("name=" + connStringName) 
{ 
} 

Ora ho aggiunto altro stringa di connessione nel web.config per esempio

<add name="WMSEntities31" connectionString="data source=TESTDBSERVER_NAME;initial catalog=TESTDB;userid=TestUser;password=TestUserPW/> 

<add name="WMSEntities" connectionString="data source=TESTDBSERVER_NAME12;initial catalog=TESTDB12;userid=TestUser12;password=TestUserPW12/> 

Poi, durante la connessione al database di io chiamo qui di seguito il metodo passando nome connetionString come parametro di

public static List<v_POVendor> GetPOVendorList(string connectionStringName) 
{ 
    using (WMSEntities db = new WMSEntities(connectionStringName)) 
    {    
     vendorList = db.v_POVendor.ToList();     
    } 
} 
+0

Ciao, questo sembra fantastico .... la mia domanda è, se cambierà qualsiasi modello di database, come sarà l'impatto. sarà incubo di manutenzione? – niku

+0

Che cosa viene rigenerato il file model.cs, di nuovo dobbiamo aggiungere la configurazione 'WMSEntities pubbliche (string connStringName) : base (" name = "+ connStringName) { }' –

Problemi correlati