Configuración del archivo de configuración

Entity Framework permite especificar varias opciones de configuración desde el archivo de configuración. En general, EF sigue un principio de "convención antes que configuración": todas las configuraciones analizadas en este post tienen un comportamiento predeterminado, solo tendrá que preocuparse de cambiar la configuración cuando la predeterminada ya no satisfaga sus necesidades.

Una alternativa basada en código

Todas estas opciones de configuración también se pueden aplicar mediante código. A partir de EF6 se introdujo la configuración basada en código, que proporciona una manera central de aplicar la configuración desde el código. Antes de EF6, la configuración aún se puede aplicar desde el código, pero es necesario usar varias API para configurar diferentes áreas. La opción de archivo de configuración permite cambiar estos valores fácilmente durante la implementación sin actualizar el código.

Sección de configuración de Entity Framework

A partir de EF4.1, podría establecer el inicializador de base de datos para un contexto mediante la sección appSettings del archivo de configuración. En EF 4.3 se introdujo la sección entityFramework personalizada para controlar la nueva configuración. Entity Framework seguirá reconocendo inicializadores de base de datos establecidos con el formato anterior, pero se recomienda pasar al nuevo formato siempre que sea posible.

La sección entityFramework se agregó automáticamente al archivo de configuración del proyecto al instalar el paquete NuGet EntityFramework.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework"
       type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
</configuration>

Cadenas de conexión

En esta página se proporcionan más detalles sobre cómo Entity Framework determina la base de datos que se va a usar, incluidas las cadenas de conexión en el archivo de configuración.

Las cadenas de conexión van en el elemento connectionStrings estándar y no requieren la sección entityFramework.

Los modelos basados en Code First usan cadenas de conexión normales de ADO.NET. Por ejemplo:

<connectionStrings>
  <add name="BlogContext"  
        providerName="System.Data.SqlClient"  
        connectionString="Server=.\SQLEXPRESS;Database=Blogging;Integrated Security=True;"/>
</connectionStrings>

Los modelos basados en EF Designer usan cadenas de conexión de EF especiales. Por ejemplo:

<connectionStrings>
  <add name="BlogContext"  
    connectionString=
      "metadata=
        res://*/BloggingModel.csdl|
        res://*/BloggingModel.ssdl|
        res://*/BloggingModel.msl;
      provider=System.Data.SqlClient;
      provider connection string=
        &quot;data source=(localdb)\mssqllocaldb;
        initial catalog=Blogging;
        integrated security=True;
        multipleactiveresultsets=True;&quot;"
     providerName="System.Data.EntityClient" />
</connectionStrings>

Tipo de configuración basado en código (EF6 y versiones posteriores)

A partir de EF6, puede especificar el DbConfiguration para EF que se usará para la configuración basada en código en la aplicación. En la mayoría de los casos, no es necesario especificar esta configuración, ya que EF detectará automáticamente DbConfiguration. Para más información sobre cuándo es posible que tenga que especificar DbConfiguration en el archivo de configuración, consulte la sección Mover DbConfiguration de Configuración basada en código.

Para establecer un tipo de DbConfiguration, especifique el nombre del tipo cualificado de ensamblado en el elemento codeConfigurationType.

Nota:

Un nombre cualificado de ensamblado es el nombre cualificado del espacio de nombres, seguido de una coma y después el ensamblado en el que reside el tipo. También puede especificar la versión del ensamblado, la referencia cultural y el token de clave pública.

<entityFramework codeConfigurationType="MyNamespace.MyConfiguration, MyAssembly">
</entityFramework>

Proveedores de bases de datos de EF (EF6 en adelante)

Antes de EF6, las partes específicas de Entity Framework de un proveedor de base de datos tenían que incluirse como parte del proveedor de ADO.NET principal. A partir de EF6, las partes específicas de EF ahora se administran y registran por separado.

Normalmente no tendrá que registrar proveedores usted mismo. Por lo general, el proveedor lo hará al instalarlo.

Los proveedores se registran mediante la inclusión de un elemento de proveedor en la sección secundaria de proveedores de la sección entityFramework. Hay dos atributos necesarios para una entrada de proveedor:

  • invariantName identifica el proveedor principal de ADO.NET que este proveedor de EF tiene como destino.
  • type es el nombre de tipo cualificado en ensamblado de la implementación del proveedor de EF.

Nota:

Un nombre cualificado de ensamblado es el nombre cualificado del espacio de nombres, seguido de una coma y después el ensamblado en el que reside el tipo. También puede especificar la versión del ensamblado, la referencia cultural y el token de clave pública.

Por ejemplo, esta es la entrada creada para registrar el proveedor de SQL Server predeterminado al instalar Entity Framework.

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>

Interceptores (EF6.1 y versiones posteriores)

A partir de EF6.1, puede registrar interceptores en el archivo de configuración. Los interceptores permiten ejecutar lógica adicional cuando EF realiza determinadas operaciones, como ejecutar consultas de base de datos, abrir conexiones, etc.

Los interceptores se registran incluyendo un elemento interceptor en la sección interceptores secundaria de la sección entityFramework. Por ejemplo, la siguiente configuración registra el interceptor DatabaseLogger incorporado que registrará todas las operaciones de la base de datos en la consola.

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"/>
</interceptors>

Registro de operaciones de base de datos en un archivo (EF6.1 y versiones posteriores)

El registro de interceptores a través del archivo de configuración es especialmente útil cuando desea agregar el registro a una aplicación existente para ayudar a depurar un problema. DatabaseLogger admite el registro en un archivo proporcionando el nombre de archivo como parámetro de constructor.

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="C:\Temp\LogOutput.txt"/>
    </parameters>
  </interceptor>
</interceptors>

De forma predeterminada, esto hará que el archivo de registro se sobrescriba con un nuevo archivo cada vez que se inicie la aplicación. Para anexar en su lugar al archivo de registro si ya existe, use algo parecido a:

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="C:\Temp\LogOutput.txt"/>
      <parameter value="true" type="System.Boolean"/>
    </parameters>
  </interceptor>
</interceptors>

Para obtener información adicional sobre DatabaseLogger y registrar interceptores, consulte la entrada de blog EF 6.1: Activar el registro sin volver a compilar.

Fábrica de conexión predeterminada de Code First

La sección de configuración le permite especificar una fábrica de conexiones predeterminada que Code First debería usar para localizar una base de datos que usar para un contexto. La fábrica de conexiones predeterminada solo se usa cuando no se ha agregado ninguna cadena de conexión al archivo de configuración de un contexto.

Al instalar el paquete NuGet de EF se registró una fábrica de conexiones predeterminada que apunta a SQL Express o a LocalDB, dependiendo de cuál tenga instalado.

Para establecer una fábrica de conexiones, especifique el nombre del tipo cualificado del ensamblado en el elemento defaultConnectionFactory.

Nota:

Un nombre cualificado de ensamblado es el nombre cualificado del espacio de nombres, seguido de una coma y después el ensamblado en el que reside el tipo. También puede especificar la versión del ensamblado, la referencia cultural y el token de clave pública.

Este es un ejemplo de cómo establecer su propia fábrica de conexiones predeterminada:

<entityFramework>
  <defaultConnectionFactory type="MyNamespace.MyCustomFactory, MyAssembly"/>
</entityFramework>

El ejemplo anterior requiere que la fábrica personalizada tenga un constructor sin parámetros. Si es necesario, puede especificar parámetros de constructor mediante el elemento parameters.

Por ejemplo, SqlCeConnectionFactory, que se incluye en Entity Framework, requiere que proporcione un nombre invariable de proveedor al constructor. El nombre invariable del proveedor identifica la versión de SQL Compact que desea usar. La siguiente configuración hará que los contextos usen la versión 4.0 de SQL Compact de forma predeterminada.

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="System.Data.SqlServerCe.4.0" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>

Si no establece una fábrica de conexiones predeterminada, Code First usa la SqlConnectionFactory, que apunta a .\SQLEXPRESS. SqlConnectionFactory también tiene un constructor que permite invalidar partes de la cadena de conexión. Si desea usar una instancia de SQL Server distinta de .\SQLEXPRESS puede usar este constructor para establecer el servidor.

La siguiente configuración hará que Code First use MyDatabaseServer para contextos que no tengan establecida una cadena de conexión explícita.

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="Data Source=MyDatabaseServer; Integrated Security=True; MultipleActiveResultSets=True" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>

De forma predeterminada, se supone que los argumentos del constructor son de tipo cadena. Puede usar el atributo de tipo para cambiarlo.

<parameter value="2" type="System.Int32" />

Inicializadores de base de datos

Los inicializadores de base de datos se configuran por contexto. Se pueden establecer en el archivo de configuración mediante el elemento de contexto. Este elemento usa el nombre completo del ensamblado para identificar el contexto que se va a configurar.

De forma predeterminada, los contextos de Code First están configurados para usar el inicializador de CreateDatabaseIfNotExists. Hay un atributo disableDatabaseInitialization en el elemento de contexto que se puede usar para deshabilitar la inicialización de la base de datos.

Por ejemplo, la siguiente configuración deshabilita la inicialización de la base de datos para el contexto Blogging.BlogContext definido en MyAssembly.dll.

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly" disableDatabaseInitialization="true" />
</contexts>

Puede usar el elemento databaseInitializer para establecer un inicializador personalizado.

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" />
  </context>
</contexts>

Los parámetros del constructor usan la misma sintaxis que las fábricas de conexión predeterminadas.

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly">
      <parameters>
        <parameter value="MyConstructorParameter" />
      </parameters>
    </databaseInitializer>
  </context>
</contexts>

Puede configurar uno de los inicializadores de base de datos genéricos que se incluyen en Entity Framework. El atributo type usa el formato de .NET Framework para tipos genéricos.

Por ejemplo, si usa migraciones de Code First, puede configurar la base de datos para que se migre automáticamente mediante el inicializador de MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>.

<contexts>
  <context type="Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" />
  </context>
</contexts>