2013-01-21 17 views
17

Sto lavorando a un'app che utilizzerà lo stesso schema di database su più database. Per questo motivo, ho creato un database chiamato MyTemplate. Quando viene creato un nuovo utente, avranno la propria istanza del database. Quindi, verrà creato un database chiamato qualcosa come MyTemplate_[UserName]. Quando un utente accede, ho bisogno di indirizzare le loro query al loro database. Per questo motivo, so che ho bisogno di impostare la stringa di connessione in fase di esecuzione. Il mio problema è che voglio anche usare Entity Framework.Setup Entity Framework per la stringa di connessione dinamica

Attualmente, ho creato un nuovo .edmx utilizzando MyTemplate come origine. Pensavo di essere in grado di aggiornare il codice e impostare la stringa di connessione lì. Sfortunatamente, non riesco a capire come impostarlo. Il costruttore di TemplateEntities non ha un sovraccarico che mi consente di passare una stringa di connessione. Ho notato che TemplateEntities derivato da DbContext, non penso che questo sarebbe il problema.

string connectionString = GetUsersConnectionString(); 
using (TemplateEntities entities = new TemplateEntities()) 
{ 
    TemplateEntity entity = new TemplateEntity(); 

    // Save to the database 
    entities.TemplateEntity.Add(entity); 
    entities.SaveChanges(); 
} 

Sto creando lo .edmx in modo errato? O mi manca qualcosa del tutto? Tutto ciò che Google mostra è un sovraccarico che dovrebbe consentire l'inoltro di una stringa di connessione. Tuttavia, non è disponibile tale sovraccarico.

risposta

30

La classe generata TemplateEntities è contrassegnata come partial.

Tutto quello che dovete fare è aggiungere un altro file con un'altra parte della definizione di classe parziale che espone il costruttore che si desidera utilizzare:

partial class TemplateEntities 
{ 
    public TemplateEntities(string nameOrConnectionString) 
    : base(nameOrConnectionString) 
    { 
    } 
} 

quindi passare la stringa di connessione per questo costruttore.

Si desidera inserire questo codice in un file diverso in modo che non venga sovrascritto quando si aggiorna il modello edmx.

+2

Quando si esegue questa operazione, viene visualizzato un errore che dice: "oggetto" non contiene un costruttore che accetta 1 argomenti. Che cosa sto facendo di sbagliato? – user70192

+3

La definizione di classe parziale con il nuovo costruttore deve essere nello stesso spazio dei nomi della classe generata, altrimenti dichiara una nuova classe (che per impostazione predefinita deriva da 'object') –

+0

+1: Sono perplesso dal motivo per cui questo tipo di costruttore è non nel modello predefinito, ma questa è una soluzione bella e pulita, grazie. – reSPAWNed

13

La risposta di Nicholas Butler è assolutamente corretta. In aggiunta a ciò che ha detto, mi sono trovato a dover affrontare il problema di prendere una stringa di connessione esistente per il framework di entità e semplicemente puntarla su un database diverso che avesse la stessa struttura. Ho utilizzato il seguente codice per modificare solo l'origine dati della stringa esistente:

var originalConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["CSName"].ConnectionString; 
var ecsBuilder = new EntityConnectionStringBuilder(originalConnectionString); 
var sqlCsBuilder = new SqlConnectionStringBuilder(ecsBuilder.ProviderConnectionString) 
{ 
    DataSource = "newDBHost" 
}; 
var providerConnectionString = sqlCsBuilder.ToString(); 
ecsBuilder.ProviderConnectionString = providerConnectionString; 

string contextConnectionString = ecsBuilder.ToString(); 
using (var db = new SMSContext(contextConnectionString)) 
{ 
    ... 
} 
+0

queste classi sono classi incorporate 'EntityConnectionStringBuilder & SqlConnectionStringBuilder' o scritte da u? –

+0

@MonojitSarkar Sono classi .NET, non scritte da me. Questa è la sua bellezza. :-) –

Problemi correlati