Impostazioni file di configurazione

Entity Framework consente di specificare diverse impostazioni dal file di configurazione. In generale EF segue un principio di "convenzione rispetto alla configurazione": tutte le impostazioni descritte in questo post hanno un comportamento predefinito, è sufficiente preoccuparsi di modificare l'impostazione quando l'impostazione predefinita non soddisfa più i requisiti.

Alternativa basata su codice

Tutte queste impostazioni possono essere applicate anche usando il codice. A partire da EF6 è stata introdotta la configurazione basata su codice, che offre un modo centrale per applicare la configurazione dal codice. Prima di EF6, la configurazione può comunque essere applicata dal codice, ma è necessario usare varie API per configurare aree diverse. L'opzione del file di configurazione consente di modificare facilmente queste impostazioni durante la distribuzione senza aggiornare il codice.

Sezione Configurazione di Entity Framework

A partire da EF4.1 è possibile impostare l'inizializzatore di database per un contesto usando l'app Impostazioni sezione del file di configurazione. In EF 4.3 è stata introdotta la sezione entityFramework personalizzata per gestire le nuove impostazioni. Entity Framework continuerà a riconoscere gli inizializzatori di database impostati usando il formato precedente, ma è consigliabile passare al nuovo formato, se possibile.

La sezione entityFramework è stata aggiunta automaticamente al file di configurazione del progetto quando è stato installato il pacchetto 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>

Stringhe di connessione

Questa pagina fornisce altri dettagli sul modo in cui Entity Framework determina il database da usare, incluse le stringa di connessione nel file di configurazione.

le stringhe di Connessione ion vanno nell'elemento connectionStrings standard e non richiedono la sezione entityFramework.

I modelli basati su Code First usano ADO.NET stringa di connessione normali. Ad esempio:

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

I modelli basati su Ef Designer usano stringa di connessione ef speciali. Ad esempio:

<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 di configurazione basato su codice (EF6 e versioni successive)

A partire da EF6, è possibile specificare DbConfiguration per Entity Framework da usare per la configurazione basata su codice nell'applicazione. Nella maggior parte dei casi non è necessario specificare questa impostazione perché EF rileverà automaticamente DbConfiguration. Per informazioni dettagliate su quando potrebbe essere necessario specificare DbConfiguration nel file di configurazione, vedere la sezione Spostamento di DbConfiguration di Configurazione basata su codice.

Per impostare un tipo DbConfiguration, specificare il nome del tipo completo dell'assembly nell'elemento codeConfigurationType .

Nota

Un nome completo dell'assembly è il nome completo dello spazio dei nomi, seguito da una virgola, quindi dall'assembly in cui risiede il tipo. Facoltativamente, è anche possibile specificare la versione dell'assembly, le impostazioni cultura e il token di chiave pubblica.

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

Provider di database EF (EF6 e versioni successive)

Prima di EF6, le parti specifiche di Entity Framework di un provider di database devono essere incluse come parte del provider di base ADO.NET. A partire da EF6, le parti specifiche di ENTITY vengono ora gestite e registrate separatamente.

In genere non è necessario registrare manualmente i provider. Questa operazione viene in genere eseguita dal provider durante l'installazione.

I provider vengono registrati includendo un elemento provider nella sezione provider figlio della sezione entityFramework. Per una voce del provider sono necessari due attributi:

  • invariantName identifica il provider di base ADO.NET di destinazione del provider EF
  • type è il nome del tipo completo dell'assembly dell'implementazione del provider EF

Nota

Un nome completo dell'assembly è il nome completo dello spazio dei nomi, seguito da una virgola, quindi dall'assembly in cui risiede il tipo. Facoltativamente, è anche possibile specificare la versione dell'assembly, le impostazioni cultura e il token di chiave pubblica.

Di seguito è riportato un esempio della voce creata per registrare il provider SQL Server predefinito quando si installa Entity Framework.

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

Intercettori (EF6.1 e versioni successive)

A partire da EF6.1 è possibile registrare gli intercettori nel file di configurazione. Gli intercettori consentono di eseguire logica aggiuntiva quando EF esegue determinate operazioni, ad esempio l'esecuzione di query di database, l'apertura di connessioni e così via.

Gli intercettori vengono registrati includendo un elemento intercettore nella sezione figlio degli intercettori della sezione entityFramework . Ad esempio, la configurazione seguente registra l'intercettore DatabaseLogger predefinito che registrerà tutte le operazioni di database nella console.

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

Registrazione delle operazioni del database in un file (EF6.1 E versioni successive)

La registrazione degli intercettori tramite il file di configurazione è particolarmente utile quando si vuole aggiungere la registrazione a un'applicazione esistente per facilitare il debug di un problema. DatabaseLogger supporta la registrazione in un file specificando il nome file come parametro del costruttore.

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

Per impostazione predefinita, il file di log verrà sovrascritto con un nuovo file ogni volta che viene avviata l'app. Per aggiungere invece al file di log, se esiste già, usare un codice simile al seguente:

<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>

Per altre informazioni su DatabaseLogger e sulla registrazione degli intercettori , vedere il post di blog EF 6.1: Attivazione della registrazione senza ricompilazione.

Code First Default Connessione ion Factory

La sezione di configurazione consente di specificare una factory di connessione predefinita che deve essere usata da Code First per individuare un database da usare per un contesto. La factory di connessione predefinita viene usata solo quando non è stata aggiunta alcuna stringa di connessione al file di configurazione per un contesto.

Quando è stato installato il pacchetto NuGet di Entity Framework, è stata registrata una factory di connessione predefinita che punta a SQL Express o Local DB, a seconda di quella installata.

Per impostare una factory di connessione, specificare il nome del tipo completo dell'assembly nell'elemento predefinito Connessione ionFactory.

Nota

Un nome completo dell'assembly è il nome completo dello spazio dei nomi, seguito da una virgola, quindi dall'assembly in cui risiede il tipo. Facoltativamente, è anche possibile specificare la versione dell'assembly, le impostazioni cultura e il token di chiave pubblica.

Di seguito è riportato un esempio di impostazione della propria factory di connessione predefinita:

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

L'esempio precedente richiede che la factory personalizzata abbia un costruttore senza parametri. Se necessario, è possibile specificare i parametri del costruttore usando l'elemento parameters .

Ad esempio, SqlCe Connessione ionFactory, incluso in Entity Framework, richiede di fornire un nome invariante del provider al costruttore. Il nome invariante del provider identifica la versione di SQL Compact che si vuole usare. La configurazione seguente causerà l'uso predefinito dei contesti di SQL Compact versione 4.0.

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

Se non si imposta una factory di connessione predefinita, Code First usa Sql Connessione ionFactory, che punta a .\SQLEXPRESS. Sql Connessione ionFactory include anche un costruttore che consente di eseguire l'override delle parti del stringa di connessione. Se si vuole usare un'istanza di SQL Server diversa da .\SQLEXPRESS quella che è possibile usare questo costruttore per impostare il server.

La configurazione seguente causerà l'uso di MyDatabaseServer da parte di Code First per i contesti che non dispongono di un stringa di connessione esplicito impostato.

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

Per impostazione predefinita, si presuppone che gli argomenti del costruttore siano di tipo string. È possibile usare l'attributo type per modificarlo.

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

Inizializzatori di database

Gli inizializzatori di database vengono configurati in base al contesto. Possono essere impostati nel file di configurazione usando l'elemento di contesto . Questo elemento usa il nome completo dell'assembly per identificare il contesto da configurare.

Per impostazione predefinita, i contesti Code First sono configurati per l'uso dell'inizializzatore CreateDatabaseIfNotExists. È disponibile un attributo disableDatabaseInitialization sull'elemento di contesto che può essere usato per disabilitare l'inizializzazionedel database.

Ad esempio, la configurazione seguente disabilita l'inizializzazione del database per il contesto Blogging.BlogContext definito in MyAssembly.dll.

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

È possibile utilizzare l'elemento databaseInitializer per impostare un inizializzatore personalizzato.

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

I parametri del costruttore usano la stessa sintassi delle factory di connessione predefinite.

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

È possibile configurare uno degli inizializzatori di database generici inclusi in Entity Framework. L'attributo type usa il formato .NET Framework per i tipi generici.

Ad esempio, se si usa Migrazioni Code First, è possibile configurare il database di cui eseguire la migrazione automaticamente usando l'inizializzatoreMigrateDatabaseToLatestVersion<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>