2009-09-29 5 views
19

Nel mio progetto voglio eseguire alcuni test unitari sul livello DAL che utilizza EntityFramework. Sto creando dagli script un nuovo database prima di ogni esecuzione dei test (per avere sempre gli stessi dati iniziali durante i test). Alla fine dei test, questo database viene eliminato (tutto viene creato automaticamente con l'aiuto degli attributi [ClassInitialize()] e [ClassCleanup()]cambia il nome db nella stringa di connessione in fase di esecuzione in Entity Framework

Il database generato ha sempre un nome diverso, ad esempio TestDB -2009-01-31--12-00-00, per non entrare in conflitto con i database di test dei miei colleghi

Il problema reale che ho è che non ho ancora trovato un modo per dire a EntityFramework di connettersi al database generato (il nome è generato in fase di esecuzione). In questo momento si connette alla stringa di connessione specificata nel file app.config, che è normale, ovviamente. E poiché sto facendo questi test, sto cercando per qualcosa che può essere fatto al di fuori della DAL dll (senza impostare nulla direttamente sul contesto EF)

Qualsiasi aiuto è molto apprezzato.

Grazie.

risposta

38

Quando si crea ObjectContext, è necessario utilizzare il sovraccarico del costruttore che utilizza ConnectionString come parametro.

È possibile creare questo ConnectionString utilizzando EntityConnectionStringBuilder. In particolare, supponendo che il database sottostante sia SQL Server, è possibile utilizzare uno SqlConnectionStringBuilder per creare il valore per EntityConnectionStringBuilder.ProviderConnectionString.

Ecco po 'di codice che si accumula la stringa di connessione SQL Server

var scsb = new SqlConnectionStringBuilder(); 
scsb.DataSource = "localhost"; 
scsb.InitialCatalog = "MyDB"; 
scsb.IntegratedSecurity = true; 

Ed ecco qualche codice che costruisce l'Ente ConnectionString:

var builder = new EntityConnectionStringBuilder(); 
builder.Metadata = "res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl"; 
builder.Provider = "System.Data.SqlClient"; 
builder.ProviderConnectionString = scsb.ConnectionString;