2009-09-29 29 views
19

En mi proyecto quiero ejecutar algunas pruebas de unidad en la capa DAL que está utilizando EntityFramework. Estoy creando a partir de scripts una nueva base de datos antes de cada ejecución de las pruebas (para tener siempre los mismos datos iniciales al hacer las pruebas). Al final de las pruebas, esta base de datos se descarta, (todo se hace automáticamente con la ayuda de los atributos [ClassInitialize()] y [ClassCleanup()]. ​​cambiar el nombre de db en cadena de conexión en tiempo de ejecución en Entity Framework

La base de datos generada siempre tiene un nombre diferente, algo así como TestDB -2009-01-31--12-00-00, para no entrar en conflicto con las bases de datos de prueba de mis colegas.

El problema real que tengo es que no encontré aún una manera de decirle a EntityFramework que conectarse a la base de datos generada (el nombre se genera en tiempo de ejecución). En este momento se conecta a la cadena de conexión especificada en el archivo app.config, que es normal, por supuesto. Y porque estoy haciendo estas pruebas, estoy buscando para algo que se puede hacer desde fuera del DAL dll (sin establecer nada directamente en el contexto de EF).

Cualquier ayuda es muy apreciada.

Gracias.

Respuesta

38

Cuando crea el ObjectContext, necesitará usar la sobrecarga del constructor que toma un ConnectionString como parámetro.

Puede construir este ConnectionString usando un EntityConnectionStringBuilder. Más específicamente, suponiendo que su base de datos subyacente es SQL Server, puede usar un SqlConnectionStringBuilder para generar el valor de EntityConnectionStringBuilder.ProviderConnectionString.

Aquí hay un código que se acumula la cadena de conexión de SQL Server

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

Y aquí hay un código que construye la Entidad 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; 
Cuestiones relacionadas