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.
Linee guida per i dati di configurazione
- Non archiviare mai la password o altri dati sensibili nel codice del provider di configurazione o in file di configurazione di testo normale.
- Non usare i segreti di produzione in ambienti di sviluppo o di test.
- Specificare i segreti all'esterno del progetto in modo che non possano essere inavvertitamente inviati a un repository del codice sorgente.
- Valutare la possibilità di proteggere il contenuto del file di configurazione usando la configurazione protetta.
Avviso
Questo articolo usa un database locale che non richiede l'autenticazione dell'utente. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app di test e produzione distribuite, vedere Proteggere i flussi di autenticazione.
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 la sezione appSettings 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 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=
"data source=(localdb)\mssqllocaldb;
initial catalog=Blogging;
integrated security=True;
multipleactiveresultsets=True;""
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 Connection 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 LocalDB, a seconda di quella installata.
Per impostare una factory di connessione, specificare il nome del tipo completo dell'assembly nell'elemento defaultConnectionFactory .
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, SqlCeConnectionFactory, 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 SqlConnectionFactory, che punta a .\SQLEXPRESS
. SqlConnectionFactory 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'inizializzazione del 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>