Actualización: Problema resuelto, ver al final de esta pregunta.

El problema:

Estamos tratando de usar Entity Framework 6 y el código de configuración basada en un escenario, hemos de utilizar un Servidor SQL server y SQL Server CE en el mismo AppDomain.

Esta bastante simple escenario no parece ser compatible «por diseño». Desde el equipo EF:

Nota: no se admiten tener múltiples de configuración de las clases que se utilizan en
el mismo dominio de aplicación. Si utiliza este atributo para establecer diferentes
configuración de clases para los dos contextos se producirá una excepción.

Más información aquí: Basado en código de Configuración (Codeplex)

La pregunta:

¿Cómo nos movemos hacia adelante, desde aquí? Cualquier ayuda sería muy apreciada! Es allí una manera más flexible para conectar una configuración en un contexto en lugar de un AppDomain?

(Nuestro contexto clases se encuentran en diferentes asambleas. Hemos probado el DbConfigurationType atributo, pero el problema es EF sí mismo)

Archivos de configuración:

De configuración de SQL server normales

public class EfConfiguration : DbConfiguration
{
    public EfConfiguration()
    {
        SetProviderServices(
            SqlProviderServices.ProviderInvariantName, 
            SqlProviderServices.Instance);

        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}

De configuración de SQL Server Compact Edition

public class EfCeConfiguration : DbConfiguration
{
    public EfCeConfiguration()
    {
        SetProviderServices(
            SqlCeProviderServices.ProviderInvariantName,
            SqlCeProviderServices.Instance);

        SetDefaultConnectionFactory(
            new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName));
    }
}

ACTUALIZACIÓN:

El error que obtenemos es:

Sistema.TypeInitializationException : El inicializador de tipo
‘Miproyecto.Los repositorios.De la Base.DataContext’
lanzó una excepción. —-> Sistema.InvalidOperationException : Un
ejemplo de ‘EfCeConfiguration’ fue el set, pero este tipo no era
descubierto en la misma asamblea que los ‘DataContext de contexto. Ya sea
poner el DbConfiguration tipo en la misma asamblea que los DbContext
tipo de uso DbConfigurationTypeAttribute en el DbContext tipo de
especificar el DbConfiguration tipo, o establecer el DbConfiguration tipo en
el archivo de configuración. Ver http://go.microsoft.com/fwlink/?LinkId=260883 para
más información.

UPDATE 2, la solución
Como se describió anteriormente, sólo podemos tener una configuración. Este es un problema ya que Sql y SqlCe utiliza diferentes proveedores. Si utilizamos el «SetDefaultConnectionFactory» para adaptarse a un tipo de base de datos, el otro va a fallar.

Lugar, el suministro de la conexión en el contexto, como se describe en el post marcado como respuesta a continuación. Una vez que usted siempre inicializar el contexto con una conexión en contraposición a una connectionstring que son buenos para ir. Usted puede quitar la SetDefaultConnectionFactory llamada de la configuración. Estamos usando sólo el código a continuación para configurar el SqlCe Contexto y sin necesidad de configuración para Sql Contexto.

  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);
        }
    }
  • Estoy un poco confundida, tengo dos bases de datos separada en dos proyectos de C# (asambleas) cada uno con su propia configuración y nunca han tenido ningún problema en absoluto.
  • Kirk: ¿estás usando EF6 y hacer que se ejecuten en el mismo Dominio de Aplicación? Utilizamos nunit y se realiza un test de integración a través de dos sistemas, pero funcionando como uno solo. Trabajó muy bien en la EF5 donde uno no tiene que especificar el proveedor en configuraton.
  • Sí, y sí. Lo de error que estás experimentando?
  • El descubrimiento de la DBConfiguration si se utiliza es el problema. Tal vez el escenario tiene todas las piezas en el ensamblaje correcto para la detección automática. Si DBConfig clases para ser utilizado en la misma asamblea 🙁 se pone cachondo
  • Me da la esperanza de que usted ha solucionado este! 🙂 He publicado el error en una actualización en la pregunta.
  • la diferencia es que mi configuración está contenida en la misma asamblea que los datos de mi contexto. Hay una razón que usted no puede hacer eso?
  • Problema resuelto! El problema era que estábamos creando DbContext con connectionstrings que no combina bien con un singleton connectionFactory cuando desea conexiones a Sql y SqlCe. En su lugar ahora creamos el DbContext el envío de conexiones específicas. Ahora la configuración de las fábricas puede ser eliminado.
  • Tengo exactamente el mismo problema, pero entre mssql y mysql. Intento aplicar la solución, pero MySqlEFConfiguration parece diferente
  • la sacaste de trabajo de alguna manera yo estoy ejecutando en exactamente el mismo problema con mssql & mysql juntos?
  • Fue hace mucho tiempo, pero recuerdo que me tuve que ir de nuevo en EF5

3 Comentarios

  1. 13

    EDICIÓN: basado En datos de Error:
    ¿Ya se trate de decirle EF donde la configuración de la clase se encuentra?

    [DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
    public class MyContextContext : DbContext
    {
    }

    Si que no puede ser hecho trabajar, alternativa

    Usar 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) {  }

    luego necesitas una «DBConnection» conexión para cada proveedor.
    Para SQL server

          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 SqlCe de fábrica, también puede generar una DBConnection
    SqlCe conexión factor de crear la conexión

    • Sí, lo hice a tratar de especificar para los archivos de configuración. Ese es el mensaje que recibí.
    • Gracias hombre! Que ya tenía el concepto de la CE-la conexión, pero para las conexiones regulares se utilizó la cadena de conexión. Cuando por el contrario nos suministra una conexión con el contexto de la configuración no era necesario ya! (Excepto para la definición del proveedor)
    • Usted podría mencionar que MyAssembly tiene que ser un nombre completo.
    • soady qué sabe usted acerca de oracle ofrecen?
    • Nunca he usado Oráculos EF proveedor. Golpeó a su sitio web para averiguar más. oracle.com/technetwork/topics/dotnet/downloads/…
    • Enlace útil para los futuros espectadores. Se explica cómo configurar las secciones. msdn.microsoft.com/en-us/data/jj680699

  2. 2

    lo que yo hice:

    public partial class MyDataBaseContext : DbContext
    {
        public MyDataBaseContext (string ConnectionString)
            : base(ConnectionString)
        {
        }
    }
    • con algo como var ConnectionString = @"Data Source="C:\temp\mydatabase.sdf" esto funciona bien.
    • Desde mi MVC HomeController clase, hice esto: public static readonly cadena de conStr = ConfigurationManager.ConnectionStrings[«SudentConext»].ToString(); MyDataBaseContext db = new MyDataBaseContext(conStr);
  3. 0

    He encontrado la solución en un post en un post del foro de Microsoft.

    Básicamente, yo tenía dos proyectos, cada uno con su propio contexto. Entity Framework fue de cargar (el primero) uno de los DbConfiguration clases y tratando de utilizar esta misma configuración en ambos proyectos. Esa es la razón por la mensaje de error que dice algo como

    «Una instancia de ‘EfCeConfiguration’ fue el set, pero este tipo no fue descubierto en la misma asamblea que los ‘DataContext de contexto».

    Así, como alguien sugirió en que Microsoft post del foro, he quitado todos los [DbConfigurationType(typeof(DbConfigurationClass))] anotaciones de las clases que heredan de DbContext en ambos proyectos, y el error no vuelva a suceder nunca mas.

    • Pero, ¿se ejecute después de que? Quiero decir, el DbConfiguration subclase que uso es importante para que funcione correctamente en tiempo de ejecución. Se configura un montón de motor de base de datos específicos de las cosas (por ejemplo, completamente diferente configuración de MySQL vs MSSQL) como la dependencia de resolución (por ejemplo. MySqlDependencyResolver), fábrica de proveedor (por ejemplo, MySqlClientFactory), proveedor de servicios (por ejemplo, MySqlProviderServices), conexión de fábrica (por ejemplo, MySqlConnectionFactory), la migración generador, proveedor de la fábrica de resolución, que se manifiesta token de resolución, historia y contexto. Usted no sólo puede no especificar todo eso y que funcione.
    • No lo sé, el hno. No recuerdo los detalles del proyecto en el que estaba trabajando cuando me respondió, pero estoy seguro de que se resuelva el asunto en cuestión en ese momento. Ahora, para comprobar las cosas que usted está señalando, creo que usted estará en mejores condiciones de probar porque no tengo el medio ambiente con este problema sucediendo más.

Dejar respuesta

Please enter your comment!
Please enter your name here