stringhe e modelli di Connessione ion
Questo argomento illustra in che modo Entity Framework individua la connessione al database da usare e come modificarla. I modelli creati con Code First e Ef Designer sono entrambi trattati in questo argomento.
In genere un'applicazione Entity Framework usa una classe derivata da DbContext. Questa classe derivata chiamerà uno dei costruttori nella classe DbContext di base per controllare:
- Modalità di connessione del contesto a un database, ovvero il modo in cui viene trovato o usato un stringa di connessione
- Indica se il contesto userà il calcolo di un modello usando Code First o caricare un modello creato con Entity Framework Designer
- Opzioni avanzate aggiuntive
I frammenti seguenti mostrano alcuni dei modi in cui è possibile usare i costruttori DbContext.
Usare Code First con connessione per convenzione
Se non è stata eseguita alcuna altra configurazione nell'applicazione, la chiamata al costruttore senza parametri in DbContext causerà l'esecuzione di DbContext in modalità Code First con una connessione di database creata per convenzione. Ad esempio:
namespace Demo.EF
{
public class BloggingContext : DbContext
{
public BloggingContext()
// C# will call base class parameterless constructor by default
{
}
}
}
In questo esempio DbContext usa il nome completo dello spazio dei nomi della classe di contesto derivata, Demo.EF.BloggingContext, come nome del database e crea un stringa di connessione per questo database usando SQL Express o Local DB. Se entrambi sono installati, verrà usato SQL Express.
Visual Studio 2010 include SQL Express per impostazione predefinita e Visual Studio 2012 e versioni successive include Local DB. Durante l'installazione, il pacchetto NuGet EntityFramework controlla quale server di database è disponibile. Il pacchetto NuGet aggiornerà quindi il file di configurazione impostando il server di database predefinito usato da Code First durante la creazione di una connessione per convenzione. Se SQL Express è in esecuzione, verrà usato. Se SQL Express non è disponibile, Local DB verrà registrato come predefinito. Non vengono apportate modifiche al file di configurazione se contiene già un'impostazione per la factory di connessione predefinita.
Usare Code First con la connessione per convenzione e il nome del database specificato
Se non è stata eseguita alcuna altra configurazione nell'applicazione, chiamare il costruttore di stringa in DbContext con il nome del database che si vuole usare causerà l'esecuzione di DbContext in modalità Code First con una connessione di database creata per convenzione al database di tale nome. Ad esempio:
public class BloggingContext : DbContext
{
public BloggingContext()
: base("BloggingDatabase")
{
}
}
In questo esempio DbContext usa "BloggingDatabase" come nome del database e crea un stringa di connessione per questo database usando SQL Express (installato con Visual Studio 2010) o Local DB (installato con Visual Studio 2012). Se entrambi sono installati, verrà usato SQL Express.
Usare Code First con stringa di connessione nel file app.config/web.config
È possibile scegliere di inserire un stringa di connessione nel file app.config o web.config. Ad esempio:
<configuration>
<connectionStrings>
<add name="BloggingCompactDatabase"
providerName="System.Data.SqlServerCe.4.0"
connectionString="Data Source=Blogging.sdf"/>
</connectionStrings>
</configuration>
Si tratta di un modo semplice per indicare a DbContext di usare un server di database diverso da SQL Express o Local DB. L'esempio precedente specifica un database SQL Server Compact Edition.
Se il nome del stringa di connessione corrisponde al nome del contesto (con o senza qualifica dello spazio dei nomi), verrà trovato da DbContext quando viene usato il costruttore senza parametri. Se il nome stringa di connessione è diverso dal nome del contesto, è possibile indicare a DbContext di usare questa connessione in modalità Code First passando il nome stringa di connessione al costruttore DbContext. Ad esempio:
public class BloggingContext : DbContext
{
public BloggingContext()
: base("BloggingCompactDatabase")
{
}
}
In alternativa, è possibile usare il formato "name=<stringa di connessione name>" per la stringa passata al costruttore DbContext. Ad esempio:
public class BloggingContext : DbContext
{
public BloggingContext()
: base("name=BloggingCompactDatabase")
{
}
}
Questo modulo rende esplicito che si prevede che il stringa di connessione venga trovato nel file di configurazione. Se non viene trovato un stringa di connessione con il nome specificato, verrà generata un'eccezione.
Database/Model First con stringa di connessione nel file app.config/web.config
I modelli creati con Entity Framework Designer sono diversi da Code First in quanto il modello esiste già e non viene generato dal codice quando viene eseguita l'applicazione. Il modello in genere esiste come file EDMX nel progetto.
La finestra di progettazione aggiungerà un stringa di connessione EF al file app.config o web.config. Questo stringa di connessione è speciale in quanto contiene informazioni su come trovare le informazioni nel file EDMX. Ad esempio:
<configuration>
<connectionStrings>
<add name="Northwind_Entities"
connectionString="metadata=res://*/Northwind.csdl|
res://*/Northwind.ssdl|
res://*/Northwind.msl;
provider=System.Data.SqlClient;
provider connection string=
"Data Source=.\sqlexpress;
Initial Catalog=Northwind;
Integrated Security=True;
MultipleActiveResultSets=True""
providerName="System.Data.EntityClient"/>
</connectionStrings>
</configuration>
Ef Designer genererà anche codice che indica a DbContext di usare questa connessione passando il nome stringa di connessione al costruttore DbContext. Ad esempio:
public class NorthwindContext : DbContext
{
public NorthwindContext()
: base("name=Northwind_Entities")
{
}
}
DbContext sa caricare il modello esistente (anziché usare Code First per calcolarlo dal codice) perché l'stringa di connessione è un'istanza di Entity Framework stringa di connessione contenente i dettagli del modello da usare.
Altre opzioni del costruttore DbContext
La classe DbContext contiene altri costruttori e modelli di utilizzo che consentono alcuni scenari più avanzati. Alcune di queste sono indicate di seguito:
- È possibile usare la classe DbModelBuilder per compilare un modello Code First senza creare un'istanza di DbContext. Il risultato di questa operazione è un oggetto DbModel. È quindi possibile passare questo oggetto DbModel a uno dei costruttori DbContext quando si è pronti per creare l'istanza DbContext.
- È possibile passare un stringa di connessione completo a DbContext anziché solo al database o stringa di connessione nome. Per impostazione predefinita, questa stringa di connessione viene usata con il provider System.Data.SqlClient. Questa operazione può essere modificata impostando un'implementazione diversa di I Connessione ionFactory sul contesto. Database.Default Connessione ionFactory.
- È possibile usare un oggetto Db Connessione ion esistente passandolo a un costruttore DbContext. Se l'oggetto connessione è un'istanza di Entity Connessione ion, il modello specificato nella connessione verrà usato anziché calcolare un modello usando Code First. Se l'oggetto è un'istanza di un altro tipo, ad esempio Sql Connessione ion, il contesto lo userà per la modalità Code First.
- È possibile passare un ObjectContext esistente a un costruttore DbContext per creare un oggetto DbContext che esegue il wrapping del contesto esistente. Può essere usato per le applicazioni esistenti che usano ObjectContext, ma che vogliono sfruttare DbContext in alcune parti dell'applicazione.