Configuração de configura

O Entity Framework permite que várias configurações sejam especificadas do arquivo de configuração. Em geral, o 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 atender mais aos seus requisitos.

Uma alternativa Code-Based

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

Seção Configuração da Estrutura de Entidade

A partir do EF4.1, você pode definir o inicializador de banco de dados para um contexto usando a seção appSettings do arquivo de configuração. No EF 4.3, apresentamos a seção entityFramework personalizada para lidar com as novas configurações. O Entity Framework ainda reconhecerá inicializadores de banco de dados definidos usando o formato antigo, mas recomendamos migrar 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 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 a ser usado, incluindo cadeias de conexão no arquivo de configuração.

As cadeias de conexão entram no elemento connectionStrings padrão e não exigem a seção entityFramework .

Os modelos baseados em código primeiro usam 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 EF usam cadeias de conexão 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>

Code-Based Tipo de Configuração (EF6 Em Diante)

A partir do EF6, você pode especificar o DbConfiguration para EF a ser usado para configuração baseada em código em seu aplicativo. Na maioria dos casos, você não precisa especificar essa configuração, pois o EF descobrirá automaticamente sua DbConfiguration. Para obter detalhes de quando talvez seja necessário especificar dbConfiguration em seu arquivo de configuração, consulte a seção Movendo DbConfiguration da Configuração Baseada em Código.

Para definir um tipo DbConfiguration, especifique o nome de tipo qualificado do assembly no elemento codeConfigurationType .

Observação

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

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

Provedores de Banco de Dados EF (EF6 Em Diante)

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

Normalmente, você não precisará registrar provedores por conta própria. Normalmente, isso será feito pelo provedor ao instalá-lo.

Os provedores são registrados incluindo um elemento provedor na seção filho de provedores da seção entityFramework . Há dois atributos necessários para uma entrada de provedor:

  • invariantName identifica o provedor de ADO.NET principal que esse provedor de EF tem como destino
  • type is the assembly qualified type name of the EF provider implementation

Observação

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

Como exemplo, aqui está a entrada criada para registrar o provedor de SQL Server padrão ao instalar 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, você pode registrar interceptadores no arquivo de configuração. Interceptadores permitem que você execute uma lógica adicional quando o EF executa determinadas operações, como executar consultas de banco de dados, abrir conexões etc.

Interceptadores são registrados incluindo um elemento interceptor na seção filho de interceptadores da seção entityFramework . Por exemplo, a configuração a seguir registra o interceptador DatabaseLogger interno que registrará todas as operações de banco de dados no Console.

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

Registrando operações de banco de dados em um arquivo (EF6.1 em diante)

Registrar interceptadores por meio do arquivo de configuração é especialmente útil quando você deseja adicionar log a um aplicativo existente para ajudar a depurar um problema. O DatabaseLogger dá suporte ao log em um arquivo fornecendo o nome do arquivo como um parâmetro de 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 com um novo arquivo sempre que o aplicativo for iniciado. Em vez disso, acrescentar ao arquivo de log se ele já existir usará 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 informações adicionais sobre DatabaseLogger e registrar interceptadores, consulte a postagem de blog EF 6.1: Ativando o log sem recompilar.

Code First Default Connection Factory

A seção de configuração permite que você especifique uma fábrica de conexões padrão que o Code First deve usar para localizar um banco de dados a ser usado para um contexto. A fábrica de conexões padrão só é usada quando nenhuma cadeia de conexão foi adicionada ao arquivo de configuração para um contexto.

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

Para definir uma fábrica de conexões, especifique o nome de tipo qualificado do assembly no elemento defaultConnectionFactory .

Observação

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

Aqui está um exemplo de como definir sua própria fábrica de conexões padrão:

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

O exemplo acima requer que a fábrica personalizada tenha um construtor sem parâmetros. Se necessário, você pode especificar parâmetros de construtor usando o elemento de parâmetros .

Por exemplo, o SqlCeConnectionFactory, incluído no Entity Framework, exige que você forneça um nome invariável do provedor ao construtor. O nome invariável do provedor identifica a versão do SQL Compact que você deseja usar. A configuração a seguir fará com que os contextos usem 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 uma fábrica de conexões padrão, o Code First usará o SqlConnectionFactory, apontando para .\SQLEXPRESS. O SqlConnectionFactory também tem um construtor que permite substituir partes da cadeia de conexão. Se você quiser usar um SQL Server instância diferente de .\SQLEXPRESS poder usar esse construtor para definir o servidor.

A configuração a seguir fará com que o Code First use MyDatabaseServer para contextos que não têm um conjunto de cadeias de conexão 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>

Por padrão, supõe-se que os argumentos do construtor são de cadeia de caracteres de tipo. Você pode usar o atributo de tipo para alterar isso.

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

Inicializadores de banco de dados

Inicializadores de banco de dados são configurados por contexto. Eles podem ser definidos no arquivo de configuração usando o elemento de contexto . Esse elemento usa o nome qualificado do assembly para identificar o contexto que está sendo configurado.

Por padrão, os contextos Code First são configurados para usar o inicializador CreateDatabaseIfNotExists. Há um atributo de desableDatabaseInitialization no elemento de contexto que pode ser usado para desabilitar a inicialização do banco de dados.

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

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

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

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

Os parâmetros de construtor usam a mesma sintaxe que as fábricas de conexões 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 type usa o formato .NET Framework para tipos genéricos.

Por exemplo, se você estiver usando Migrações do Code First, poderá configurar o banco de dados a ser migrado automaticamente usando o MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration> inicializador.

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