Uso de Entity Framework Power Tools CTP1 con Oracle, MySQL, PostgreSQL y SQLite

Lanzado poco después de Entity Framework 4.1, Herramientas eléctricas EF CTP1 está diseñado para brindar soporte durante el desarrollo para el desarrollo, lo que implica el uso del enfoque Code-First de Entity Framework. EF Power Tools CTP1 se puede descargar desde Galería de Visual Studio. Más adelante en el artículo, encontrará una explicación de cómo usar Entity Framework Power Tools con los proveedores de Devart dotConnect para Oráculo, mysql, postgresql y SQLiteasí como información sobre revelador de esencia que se puede utilizar como una alternativa a Entity Framework Power Tools.

Este artículo trata sobre lo siguiente:

Índice

    Uso de DbContext existente

    La funcionalidad de Entity Framework Power Tools está diseñada principalmente para usar la clase DbContext existente.

    ¡Atención! La clase derivada de DbContext debe tener un constructor abierto sin parámetros; EF Power Tools utilizará este constructor.

    El principal problema de usar CTP1 con Oracle, MySQL, PostgreSQL y SQLite es que un desarrollador no puede usar una técnica de almacenamiento de cadena de conexión común cuyo nombre coincida con el nombre de clase del modelo en el archivo de configuración de la aplicación. EF Power Tools CTP1 simplemente no usa esta cadena y conduce a errores y fallas en la funcionalidad.

    Para resolver este problema, el desarrollador puede elegir una de las siguientes formas:

    • Copie la cadena de conexión del archivo de configuración del programa a machine.config (recuerde que machine.config debe hacer referencia a .NET4 Framework, no a .NET2. Por lo general, este archivo se puede encontrar aquí: WindowsMicrosoft.NETFrameworkv4.0.30319Configmachine.config ). Esta técnica es bastante simple y, aunque engorrosa, aceptable para el desarrollo. Utilice este método con cuidado para mantener la exactitud del archivo de configuración de .NET Framework.
    • Coloque la cadena de conexión en el archivo de configuración de Visual Studio 2010 (generalmente se encuentra aquí: Archivos de programaMicrosoft Visual Studio 10.0Common7IDEdevenv.exe.config). Esta opción no es muy conveniente y debe usarla con cuidado para mantener la configuración de VS correcta.
    • Si su proyecto contiene modelos Code-First para un solo proveedor, puede definir DefaultConnectionFactory. Esta opción no se puede usar si su programa usa múltiples proveedores/bases de datos. Cuando se usa con Oracle, MySQL, PostgreSQL y SQLite, esta opción implica escribir una implementación de IDbConnectionFactory.
    • El diseñador de modelos predeterminado debe enviar una instancia de la conexión del proveedor al constructor base de DbContext.

    Los dos primeros métodos son bastante simples y solo implican copiar la cadena de conexión. Ahora analizaremos los dos últimos métodos, ya que requieren escribir código adicional.

    Uso de fábrica de conexiones predeterminadas

    Si decide utilizar este método, deberá escribir una implementación de IDbConnectionFactory. El siguiente es un ejemplo de tal implementación:

    Clase DevartConnectionFactory
    public class DevartConnectionFactory : IDbConnectionFactory {
    
        public DevartConnectionFactory(string providerInvariantName, string configFileName) {
    
          this.ProviderInvariantName = providerInvariantName;
          this.ConfigFileName = configFileName;
        }
    
        #region IDbConnectionFactory Members
    
        public DbConnection CreateConnection(string nameOrConnectionString) {
    
          if (String.IsNullOrWhiteSpace(nameOrConnectionString))
            throw new ArgumentNullException("nameOrConnectionString");
    
          DbProviderFactory providerFactory = DbProviderFactories.GetFactory(ProviderInvariantName);
          if (providerFactory == null)
            throw new InvalidOperationException(String.Format("The '{0}' provider is not registered on the local machine.", ProviderInvariantName));
    
          DbConnection connection = providerFactory.CreateConnection();
    
          if (nameOrConnectionString.Contains("=")) {
            connection.ConnectionString = nameOrConnectionString;
          }
          else {
    
            string dbContextClassName = nameOrConnectionString;
            if (dbContextClassName.Contains('.')) {
              int classNameFrom = nameOrConnectionString.LastIndexOf('.') + 1;
              int classNameLength = nameOrConnectionString.Length - classNameFrom;
              dbContextClassName = nameOrConnectionString.Substring(classNameFrom, classNameLength);
            }
    
            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            map.ExeConfigFilename = this.ConfigFileName;
            Configuration assemblyConfig = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
    
            ConnectionStringSettings connectionSettings = assemblyConfig.ConnectionStrings.ConnectionStrings[dbContextClassName];
    
            if (connectionSettings == null)
              throw new InvalidOperationException(String.Format("Can't find the '{0}' connection string in the config file.", dbContextClassName));
    
            if (connectionSettings.ProviderName != ProviderInvariantName)
              throw new InvalidOperationException(String.Format("The '{0}' connection string was expected to be defined for the '{1}' provider, but it is defined for the '{2}' provider.", dbContextClassName, ProviderInvariantName, connectionSettings.ProviderName));
    
            connection.ConnectionString = connectionSettings.ConnectionString;
          }
    
          return connection;
        }
    
        #endregion
    
        #region Properties
    
        public string ProviderInvariantName {
          get;
          set;
        }
    
        public string ConfigFileName {
          get;
          set;
        }
    
        #endregion
    
      }

    Para usarlo, coloque la definición DefaultConnectionFactory, por ejemplo, en un constructor estático de la clase DbContext. Para dotConnect para Oracle podría verse así:

      public class MyOracleContext : DbContext {
    
        public MyOracleContext() {
        }
    
        static MyOracleContext() {
    
          Base de datos.DefaultConnectionFactory = new DevartConnectionFactory(
            providerInvariantName: "Devart.Data.Oracle",
            configFileName: @"D:ProjectsSamplesCrmDemo.EFCodeFirstapp.config"
          );
        }
    
        //...
    
      }

    DevartConnectionFactory se puede utilizar con dotConnect para Oracle, MySQL, PostgreSQL y SQLite; sin embargo, asegúrese de que el nombre del proveedor invariable esté definido correctamente. Además, verifique que la ruta al archivo de configuración de su aplicación esté configurada correctamente.
    Para SQLite, consulte la implementación de IDbConnectionFactory específica de SQLite, ampliada con funciones avanzadas; consulte el ejemplo de clase SQLiteConnectionFactory en el artículo "Código de Entity Framework: el primer soporte para Oracle, MySQL, PostgreSQL y SQLite".

    Ejemplo de conexión a un proveedor específico

    En este caso, el proveedor predeterminado debe crear una conexión para un proveedor específico. Demostraremos que el ejemplo de dotConnect para Oracle; la idea es similar para otros proveedores.
    Esto se puede lograr creando el tipo de conexión requerido. También necesitamos agregar explícitamente enlaces a la compilación de un proveedor en particular para el proyecto.

      public class MyOracleContext : DbContext {
         public MyOracleContext()
          : base(new Devart.Data.Oracle.OracleConnection("Data Source=ora1020;User Id=scott;Password=tiger;"), true) {
        }
         //...
       }

    También podemos crear una conexión usando DbProviderFactory.

      
      public class MyOracleContext : DbContext {
    
        public MyOracleContext()
          : base(CreateConnection(), true) {
        }
    
        private const string providerInvariantName = "Devart.Data.Oracle";
    
        private static DbConnection CreateConnection() {
    
          DbProviderFactory providerFactory = DbProviderFactories.GetFactory(providerInvariantName);
          if (providerFactory == null)
            throw new InvalidOperationException(String.Format("The '{0}' provider is not registered on the local machine.", providerInvariantName));
    
          DbConnection connection = providerFactory.CreateConnection();
          connection.ConnectionString = "Data Source=ora1020;User Id=scott;Password=tiger;";
          return connection;
        }
    
        //...
    
      }

    Genere el primer modelo de código a partir de una base de datos existente

    La primera versión de Entity Framework Power Tools también incluía la capacidad de generar un modelo Code-First con mapeo fluido desde una base de datos existente. Aunque útil, esta característica está limitada en cuanto a su flexibilidad: el desarrollador solo puede establecer una cadena de conexión; Luego, las clases se generan a partir de todos los objetos de la base de datos accesibles para el usuario. Esto no es muy conveniente, porque en Oracle, por ejemplo, el usuario tiene acceso a muchos esquemas que contienen cientos ya veces miles de tablas.

    En lugar de recurrir a esta funcionalidad limitada, los usuarios de nuestros proveedores de ADO.NET pueden aprovechar las capacidades de diseño impresionantemente sólidas durante el diseño. revelador de esencia, un diseñador de EF que viene con nuestros proveedores. También es posible elegir entre Base de datos: el primer enfoquecomo se muestra en EF Power Tools, y Enfoque de modelo primerodentro del cual se crean las clases de Code-First en el constructor de EDM.

    A diferencia de EF Power Tools, el enfoque Base de datos-First para desarrollar modelos EF Code-First también le permite seleccionar objetos para que estén disponibles en el modelo, establecer reglas de nomenclatura para generar nombres de clases y propiedades, etc. Además, el modelo resultante se puede modificar y mejorar en el diseñador.

    Para satisfacer mejor las necesidades de los desarrolladores, la generación de código Code-First en Entity Developer para C # y VB se basa en la plantilla T4, que es fácilmente accesible y se puede modificar en el editor multifunción T4 contenido en Entity Developer.

    Para obtener más información sobre el desarrollo Code-First en Entity Developer, consulte Entity Developer - Plantilla EF Code First DbContext.

    Ver también

    Artículos de interés

    Subir