.net - usuario - Entity Framework 6 establece el tiempo de ejecución de la cadena de conexión
que es una cadena de conexion (2)
Obtendrá la excepción del modo Código Primero porque está pasando un DbConnection
creado con la cadena de conexión ADO.NET. Esta cadena de conexión no incluye referencias a archivos de metadatos, por lo que EntityFramework no sabe dónde encontrarlos.
Para crear un DbContext
con una cadena de conexión configurada por programación adecuada, use la clase EntityConnectionStringBuilder .
var entityBuilder = new EntityConnectionStringBuilder();
// use your ADO.NET connection string
entityBuilder.ProviderConnectionString = conString;
// Set the Metadata location.
entityBuilder.Metadata = @"res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl";
var dbContext = new DbContext(entityBuilder.ConnectionString);
Estamos en un entorno mixto donde nuestra aplicación utiliza ADO.NET y Entity Framework.
Como ambos apuntan al mismo servidor SQL físico, nos gustaría eliminar la cadena de conexión de Entity Framework del archivo config y luego construir automáticamente la cadena en función de las cadenas de conexión ADO.NET actuales.
Esto nos ahorra errores cuando un desarrollador cambió la cadena ADO.NET pero se olvidó de cambiar la cadena de conexión de Entity Framework.
He leído esto pero no respondieron la pregunta.
¿Cómo creo una cadena de conexión mediante programación en MS SQL en Entity Framework 6?
Si creo mi propia DbConnection y la transfiero a DbContext (existingConnection, contextOwnsConnection), arroja un error "El contexto se está utilizando en el modo Code First con código que se generó a partir de un archivo EDMX para el desarrollo de Database First o Model First. "
No estoy usando Code First.
https://msdn.microsoft.com/en-us/data/jj680699
Se habló de la configuración de la base de código en EF 6, pero el artículo no muestra ningún código que realmente haya cambiado la cadena de conexión.
ACTUALIZADO: Más información para ayudar a aclarar mi pregunta.
NO estoy usando el código primero y me gustaría construir una cadena de conexión fuera del archivo de configuración.
El DbContext que estoy usando es una clase parcial del archivo DbContext generado automáticamente que genera la plantilla T4.
Tenía la impresión de que necesitaba crear una clase heredada de DbConfiguration y hacer algo en esa clase, pero el único ejemplo que encuentro es el uso de Azure.
https://msdn.microsoft.com/en-us/data/jj680699
Hay un artículo sobre Code Project que habla sobre la configuración de la cadena de conexión en tiempo de ejecución, pero el artículo se basa en construir una cadena de conexión cada vez que creo un nuevo contenedor de Entity.
http://www.codeproject.com/Tips/234677/Set-the-connection-string-for-Entity-Framework-at
Me gustaría poder usar mi clase parcial de DbContext para crear la cadena de conexión para que la persona que llama no tenga que hacer nada especial.
ACTUALIZADO: Código de trabajo para RunTime pero no DesignTime
Utilizando el código publicado por @Circular Reference "enumerado a continuación", pude cambiar la cadena de conexión sin cambiar las llamadas a mi clase Entity PERO esto no funciona para el archivo EDMX de DesignTime.
public partial class TestEntities : DbContext
{
public TestEntities() : base(GetSqlConnection(), true)
{
}
public static DbConnection GetSqlConnection()
{
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
var connectionSettings = ConfigurationManager.ConnectionStrings("Current_ADO_Connection_In_Config");
// Set the provider name.
entityBuilder.Provider = connectionSettings.ProviderName;
// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = connectionSettings.ConnectionString;
// Set the Metadata location.
entityBuilder.Metadata = "res://*/Models.TestModel.csdl|res://*/Models.TestModel.ssdl|res://*/Models.TestModel.msl";
return new EntityConnection(entityBuilder.ToString());
}
}
Ahora bien, si puedo hacer que funcione el DesignTime, sería bueno.
Puede trabajar en tiempo de diseño usando la cadena de conexión en su archivo de configuración.
<add name="DWContext" connectionString="metadata=res://*/Database.DWH.DWModel.csdl|res://*/Database.DWH.DWModel.ssdl|res://*/Database.DWH.DWModel.msl;provider=System.Data.SqlClient;provider connection string="data source=SQLSERVER_INSTANCE;initial catalog=DB_NAME;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Así que no lo elimines porque lo necesitas SOLAMENTE en el momento del diseño.
Trabaje en cambio de una manera dinámica en tiempo de ejecución usando este enfoque (similar a su último):
Extienda la clase parcial del contexto de datos:
public partial class DWContext
{
public DWContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
}
/// <summary>
/// Create a new EF6 dynamic data context using the specified provider connection string.
/// </summary>
/// <param name="providerConnectionString">Provider connection string to use. Usually a standart ADO.NET connection string.</param>
/// <returns></returns>
public static DWContext Create(string providerConnectionString)
{
var entityBuilder = new EntityConnectionStringBuilder();
// use your ADO.NET connection string
entityBuilder.ProviderConnectionString = providerConnectionString;
entityBuilder.Provider = "System.Data.SqlClient";
// Set the Metadata location.
entityBuilder.Metadata = @"res://*/Database.DWH.DWModel.csdl|res://*/Database.DWH.DWModel.ssdl|res://*/Database.DWH.DWModel.msl";
return new DWContext(entityBuilder.ConnectionString);
}
}
Y a partir de su código cree un nuevo contexto de datos EF con:
private DWContext db = DWContext.Create(providerConnectionString);
Ciao ;-)