Definições do Arquivo de Configuração

O Entity Framework permite que várias configurações sejam especificadas no arquivo de configuração. Em geral, a EF segue um ‘princípio de convenção sobre configuração’: todas as configurações discutidas nesta postagem têm um comportamento padrão, você só precisa se preocupar em alterar a configuração quando o padrão não satisfizer mais seus requisitos.

Uma alternativa com Base em Código

Todas essas configurações também podem ser utilizadas por meio do código. A partir do EF6, introduzimos a configuração baseada em código, que oferece uma maneira central de aplicar a configuração a partir do código. Antes do EF6, a configuração ainda pode ser aplicada a partir do código, mas você precisa utilizar várias APIs para configurar diferentes áreas. A opção de arquivo de configuração permite que essas configurações sejam facilmente alteradas durante a implantação sem a atualização do código.

A Seção de Configuração do Entity Framework

A partir do EF4.1, você pode definir o inicializador do banco de dados para um contexto utilizando a seção appSettings do arquivo de configuração. No EF 4.3, introduzimos a seção personalizada entityFramework para lidar com as novas configurações. O Entity Framework ainda reconhecerá os inicializadores de banco de dados definidos utilizando o formato antigo, mas recomendamos a migração para o novo formato sempre que possível.

A seção entityFramework foi adicionada automaticamente ao arquivo de configuração do seu projeto quando você instalou o pacote NuGet do 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>

Cadeias de Conexão

Esta página fornece mais detalhes sobre como o Entity Framework determina o banco de dados que deve ser utilizado, incluindo as cadeias de conexão no arquivo de configuração.

As cadeias de conexão são incluídas no elemento padrão connectionStrings e não exigem a seção entityFramework.

Os modelos baseados em Code First utilizam cadeias de conexão ADO.NET normais. Por exemplo:

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

Os modelos baseados no Designer do EF utilizam as cadeias de conexão do EF especiais. Por exemplo:

<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 configuração baseada em código (EF6 em diante)

A partir do EF6, você pode especificar a DbConfiguration que o EF deve utilizar para a configuração baseada em código no seu aplicativo. Na maioria dos casos, você não precisa especificar essa configuração, pois o EF descobrirá automaticamente sua DbConfiguration. Para obter detalhes sobre quando você precisar especificar a DbConfiguration na configuração do seu arquivo, consulte a seção Movendo a DbConfiguration da Configuração Baseada em Código.

Para definir um tipo de DbConfiguration, você deve especificar o nome do tipo qualificado para o assembly no elemento codeConfigurationType.

Observação

Um nome qualificado de assembly é o nome qualificado do namespace, seguido por uma vírgula e depois pelo assembly em que o tipo reside. Opcionalmente, você também pode especificar a versão do assembly, a cultura e o token da chave pública.

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

Provedores de Banco de Dados EF (EF6 Em diante)

Antes do EF6, as partes específicas do Entity Framework de um provedor de banco de dados tinham que ser incluídas como parte do provedor principal do ADO.NET. A partir do EF6, as partes específicas do EF agora são gerenciadas e registradas separadamente.

Normalmente, você mesmo não precisa registrar os provedores. Normalmente, isso será feito pelo provedor quando você o instalar.

Os provedores são registrados com a inclusão de um elemento provedores na seção provedores filho da seção entityFramework. Existem dois atributos exigidos para uma entrada de provedor:

  • invariantName identifica o provedor ADO.NET principal destinado a esse provedor Entity Framework
  • tipo é o nome do tipo qualificado do assembly da implementação do provedor do EF

Observação

Um nome qualificado de assembly é o nome qualificado do namespace, seguido por uma vírgula e depois pelo assembly em que o tipo reside. Opcionalmente, você também pode especificar a versão do assembly, a cultura e o token da chave pública.

Como exemplo, aqui está a entrada criada para registrar o provedor padrão do SQL Server quando você instala o Entity Framework.

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

Interceptadores (EF6.1 em diante)

A partir do EF6.1, é possível registrar interceptadores no arquivo de configuração. Os interceptadores permitem que você execute uma logica adicional quando o EF realiza determinadas operações, como executar consultas de banco de dados, abrir conexões, etc.

Os interceptadores são registrados com a inclusão de um elemento interceptador na seção interceptadores filho da seção entityFramework. Por exemplo, a configuração a seguir registra o interceptador DatabaseLogger interno que fará o log de todas as operações do banco de dados no Console.

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

Registrando em log as Operações do Banco de Dados em um Arquivo (EF6.1 em diante)

O registro de interceptores por meio do arquivo de log é especialmente útil quando você deseja adicionar o registro em log a um aplicativo existente para ajudar a depurar um problema. DatabaseLogger dá suporte para o registro em log em um arquivo, fornecendo o nome do arquivo como parâmetro do construtor.

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

Por padrão, isso fará com que o arquivo de log seja substituído por um novo arquivo sempre que o aplicativo for iniciado. Para acrescentar ao arquivo de log, se ele já existir, utilize algo como:

<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 obter mais informações sobre o DatabaseLogger e o registro de interceptadores, consulte a postagem no blog EF 6.1: ativando o registro em log sem recompilar.

Alocador da Conexão Padrão do Code First

A seção de configuração permite que você especifique um alocador de conexões padrão que o Code First deve usar para localizar um banco de dados que será utilizado em um contexto. O alocador de conexões padrão só é utilizada quando nenhuma cadeia de caracteres de conexão tiver sido adicionada ao arquivo de configuração de um contexto.

Quando você instalou o pacote NuGet do EF, foi registrada um alocador de conexões padrão que aponta para o SQL Express ou para o LocalDB, dependendo de qual deles você instalou.

Para definir um alocador de conexões, você especifica o nome do tipo qualificado do assembly no elemento defaultConnectionFactory.

Observação

Um nome qualificado de assembly é o nome qualificado do namespace, seguido por uma vírgula e depois pelo assembly em que o tipo reside. Opcionalmente, você também pode especificar a versão do assembly, a cultura e o token da chave pública.

Aqui está um exemplo de configuração do seu próprio alocador de conexões padrão:

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

O exemplo acima exige que o alocador personalizado tenha um construtor sem parâmetros. Se necessário, você pode especificar os parâmetros do construtor utilizando o elemento parâmetros.

Por exemplo, o SqlCeConnectionFactory, incluído no Entity Framework, exige que você forneça um nome invariável de provedor para o construtor. O nome da invariante do provedor identifica a versão do SQL Compact que você deseja usar. A configuração a seguir fará com que os contextos utilizem o SQL Compact versão 4.0 por padrão.

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

Se você não definir um alocador de conexões padrão, o Code First utilizará o SqlConnectionFactory, apontando para .\SQLEXPRESS. O SqlConnectionFactory também tem um construtor que permite que você substitua partes da cadeia de caracteres de conexão. Se você desejar utilizar uma instância do SQL Server diferente de .\SQLEXPRESS, poderá utilizar esse construtor para definir o servidor.

A configuração a seguir fará com que o Code First use MyDatabaseServer para contextos que não tenham uma cadeia de caracteres de conexão explícita configurada.

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

Por padrão, presume-se que os argumentos do construtor sejam do tipo cadeia de caracteres. Você pode utilizar o atributo de tipo para alterar isso.

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

Inicializadores de Banco de Dados

Os inicializadores de banco de dados são configurados por contexto. Elas podem ser definidas no arquivo de configuração utilizando o elemento contexto. Esse elemento utiliza o nome qualificado do assembly para identificar o contexto que está sendo configurado.

Por padrão, os contextos do Code First são configurados para utilizar o inicializador CreateDatabaseIfNotExists. Existe um atributo disableDatabaseInitialization no elemento contexto que pode ser utilizado para desabilitar a inicialização do banco de dados.

Por exemplo, a configuração a seguir desabilita a inicialização do banco de dados do contexto Blogging.BlogContext definido em MyAssembly.dll.

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

Você pode utilizar o elemento databaseInitializer para definir um inicializador personalizado.

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

Os parâmetros do construtor utilizam a mesma sintaxe dos alocadores de conexão padrão.

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

Você pode configurar um dos inicializadores de banco de dados genéricos incluídos no Entity Framework. O atributo tipo utiliza o formato .NET Framework para tipos genéricos.

Por exemplo, se estiver utilizando o Code First Migrations, você poderá configurar o banco de dados para ser migrado automaticamente usando o inicializador 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>