c# - mvc - EF6 y configuraciones múltiples(SQL Server y SQL Server Compact)
entity framework one to one (3)
EDIT: basado en los detalles del error: ¿Ya intentaste decirle a EF dónde se encuentra la clase de configuración?
[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
public class MyContextContext : DbContext
{
}
Si eso no se puede hacer funcionar, entonces ver alternativa
Usa el contexto con el constructor DbConnection
public class MYDbContext : DbContext {
// MIgration parameterless constructor is managed in MyMigrationsContextFactory
public MyDbContext(string connectionName) : base(connectionName) { } // no this
public MYDbContext(DbConnection dbConnection, bool contextOwnsConnection) // THIS ONE
: base(dbConnection, contextOwnsConnection) { }
entonces necesita una conexión "DBConnection" para cada proveedor. Para servidor SQL
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;
}
repita para la fábrica SqlCe, también puede generar un factor de conexión DBConnection SqlCe crear conexión
Actualización: Problema resuelto, ver el final de esta pregunta.
El problema :
Estamos tratando de usar Entity Framework 6 y la configuración basada en código en un escenario en el que usamos tanto un SQL Server como un SQL Server CE en el mismo AppDomain
.
Este escenario bastante simple parece no ser soportado "por diseño". Desde el equipo de EF:
Nota: no admitimos que se utilicen varias clases de configuración en el mismo dominio de aplicación. Si usa este atributo para establecer diferentes clases de configuración para dos contextos, se lanzará una excepción.
Más información aquí: Configuración basada en código (Codeplex)
La pregunta :
¿Cómo avanzamos desde aquí? Cualquier ayuda sería muy apreciada! ¿Existe una forma más flexible de conectar una configuración a un contexto en lugar de a un AppDomain
?
(Nuestras clases de contexto están ubicadas en diferentes ensamblajes. Hemos probado el atributo DbConfigurationType
pero el problema es EF en sí mismo)
Archivos de configuración:
Configuración para el servidor SQL normal
public class EfConfiguration : DbConfiguration
{
public EfConfiguration()
{
SetProviderServices(
SqlProviderServices.ProviderInvariantName,
SqlProviderServices.Instance);
SetDefaultConnectionFactory(new SqlConnectionFactory());
}
}
Configuración para SQL Server Compact Edition
public class EfCeConfiguration : DbConfiguration
{
public EfCeConfiguration()
{
SetProviderServices(
SqlCeProviderServices.ProviderInvariantName,
SqlCeProviderServices.Instance);
SetDefaultConnectionFactory(
new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName));
}
}
ACTUALIZAR:
El error que obtenemos es:
System.TypeInitializationException: el inicializador de tipo para ''MyProject.Repositories.Base.DataContext'' lanzó una excepción. ----> System.InvalidOperationException: se estableció una instancia de ''EfCeConfiguration'' pero este tipo no se descubrió en el mismo ensamblaje que el contexto ''DataContext''. Ponga el tipo DbConfiguration en el mismo ensamblaje que el tipo DbContext, use DbConfigurationTypeAttribute en el tipo DbContext para especificar el tipo DbConfiguration, o establezca el tipo DbConfiguration en el archivo de configuración. Consulte http://go.microsoft.com/fwlink/?LinkId=260883 para obtener más información.
ACTUALIZACIÓN 2, la solución Como se describió anteriormente, solo podemos tener una configuración. Este es un problema ya que Sql y SqlCe usan diferentes proveedores. Si usamos "SetDefaultConnectionFactory" para ajustar un tipo de base de datos, el otro fallará.
En su lugar, suministre la conexión en el contexto como se describe en la publicación marcada como respuesta a continuación. Una vez que siempre inicialice el contexto con una conexión en lugar de una cadena de conexión, estará listo. Puede eliminar la llamada a SetDefaultConnectionFactory de la configuración. Estamos usando solo el siguiente código para configurar el contexto SqlCe y ninguna configuración para el contexto SqlCe.
public class CommonEfConfiguration : DbConfiguration
{
public CommonEfConfiguration()
{
// EF does not know if the ce provider by default,
// therefore it is required to be informed about it.
// The connection factories are not necessary since the connection
// is always created in the UnitOfWork classes
SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance);
}
}
Encontré la solución en una publicación en una publicación del foro de Microsoft .
Básicamente, tuve dos proyectos, cada uno con su propio contexto. Entity Framework estaba cargando solo (la primera) una de las clases DbConfiguration y tratando de usar esta misma configuración para ambos proyectos. Ese es el motivo del mensaje de error que dice algo así como
"Se configuró una instancia de ''EfCeConfiguration'' pero este tipo no se descubrió en el mismo ensamblaje que el contexto ''DataContext''".
Entonces, como alguien sugirió en esa publicación del foro de Microsoft , [DbConfigurationType(typeof(DbConfigurationClass))]
todas las [DbConfigurationType(typeof(DbConfigurationClass))]
de las clases que heredaron de DbContext en ambos proyectos, y el error ya no ocurrió.
lo que hice:
public partial class MyDataBaseContext : DbContext
{
public MyDataBaseContext (string ConnectionString)
: base(ConnectionString)
{
}
}