Chaînes de connexion et modèles

Cette rubrique explique comment Entity Framework découvre la connexion de base de données à utiliser et comment vous pouvez la changer. Les modèles créés avec Code First et EF Designer sont tous deux décrits dans cette rubrique.

En règle générale, une application Entity Framework utilise une classe dérivée de DbContext. Cette classe dérivée appelle un des constructeurs de la classe DbContext de base pour contrôler :

  • Comment le contexte se connecte à une base de données, c’est-à-dire comment une chaîne de connexion est trouvée/utilisée
  • Si le contexte calcule un modèle en utilisant Code First ou charge un modèle créé avec EF Designer
  • Options avancées supplémentaires

Les fragments suivants montrent comment les constructeurs DbContext peuvent être utilisés.

Utiliser Code First avec une connexion par convention

Si vous n’avez pas effectué d’autre configuration dans votre application, l’appel du constructeur sans paramètre sur DbContext entraîne l’exécution de DbContext en mode Code First avec une connexion de base de données créée par convention. Par exemple :

namespace Demo.EF
{
    public class BloggingContext : DbContext
    {
        public BloggingContext()
        // C# will call base class parameterless constructor by default
        {
        }
    }
}

Dans cet exemple, DbContext utilise le nom qualifié d’espace de noms de votre classe de contexte dérivée (Demo.EF.BlogsContext) comme nom de base de données, et crée une chaîne de connexion pour cette base de données en utilisant SQL Express ou LocalDB. Si les deux sont installés, SQL Express est utilisé.

Visual Studio 2010 comprend SQL Express par défaut, et Visual Studio 2012 et versions ultérieures comprend LocalDB. Pendant l’installation, le package NuGet EntityFramework vérifie le serveur de base de données qui est disponible. Le package NuGet met ensuite à jour le fichier de configuration en définissant le serveur de base de données par défaut que Code First utilise quand il crée une connexion par convention. Si SQL Express est en cours d’exécution, il est utilisé. Si SQL Express n’est pas disponible, LocalDB est inscrit comme valeur par défaut à la place. Aucun changement n’est fait dans le fichier de configuration s’il contient déjà un paramètre pour la fabrique de connexion par défaut.

Utiliser Code First avec une connexion par convention et le nom de base de données spécifié

Si vous n’avez pas effectué d’autre configuration dans votre application, l’appel du constructeur de chaîne sur DbContext avec le nom de base de données que vous voulez utiliser entraîne l’exécution de DbContext en mode Code First avec une connexion de base de données créée par convention à la base de données de ce nom. Par exemple :

public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("BloggingDatabase")
    {
    }
}

Dans cet exemple, DbContext utilise « BlogsDatabase » comme nom de base de données et crée une chaîne de connexion pour cette base de données en utilisant SQL Express (installé avec Visual Studio 2010) ou localDB (installé avec Visual Studio 2012). Si les deux sont installés, SQL Express est utilisé.

Utiliser Code First avec une chaîne de connexion dans le fichier app.config/web.config

Vous pouvez choisir de placer une chaîne de connexion dans votre fichier app.config ou web.config. Par exemple :

<configuration>
  <connectionStrings>
    <add name="BloggingCompactDatabase"
         providerName="System.Data.SqlServerCe.4.0"
         connectionString="Data Source=Blogging.sdf"/>
  </connectionStrings>
</configuration>

C’est un moyen simple d’indiquer à DbContext d’utiliser un serveur de base de données autre que SQL Express ou LocalDB. L’exemple ci-dessus spécifie une base de données SQL Server Compact Edition.

Si le nom de la chaîne de connexion correspond au nom de votre contexte (avec ou sans qualification d’espace de noms), elle est trouvée par DbContext quand le constructeur sans paramètre est utilisé. Si le nom de la chaîne de connexion est différent du nom de votre contexte, vous pouvez indiquer à DbContext d’utiliser cette connexion en mode Code First en passant le nom de la chaîne de connexion au constructeur DbContext. Par exemple :

public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("BloggingCompactDatabase")
    {
    }
}

Vous pouvez également utiliser la forme « “name=<nom de la chaîne de connexion> » pour la chaîne passée au constructeur DbContext. Par exemple :

public class BloggingContext : DbContext
{
    public BloggingContext()
        : base("name=BloggingCompactDatabase")
    {
    }
}

Cette forme rend explicite le fait que la chaîne de connexion doit se trouver dans votre fichier de configuration. Une exception est levée si une chaîne de connexion avec le nom donné est introuvable.

Database/Model First avec une chaîne de connexion dans le fichier app.config/web.config

Les modèles créés avec EF Designer sont différents de Code First, car votre modèle existe déjà et n’est pas généré à partir du code quand l’application s’exécute. Le modèle existe généralement sous la forme d’un fichier EDMX dans votre projet.

Le concepteur ajoute une chaîne de connexion EF à votre fichier app.config ou web.config. Cette chaîne de connexion est spéciale, car elle contient des détails sur la façon de rechercher les informations dans votre fichier EDMX. Par exemple :

<configuration>  
  <connectionStrings>  
    <add name="Northwind_Entities"  
         connectionString="metadata=res://*/Northwind.csdl|  
                                    res://*/Northwind.ssdl|  
                                    res://*/Northwind.msl;  
                           provider=System.Data.SqlClient;  
                           provider connection string=  
                               &quot;Data Source=.\sqlexpress;  
                                     Initial Catalog=Northwind;  
                                     Integrated Security=True;  
                                     MultipleActiveResultSets=True&quot;"  
         providerName="System.Data.EntityClient"/>  
  </connectionStrings>  
</configuration>

EF Designer génère également du code qui indique à DbContext d’utiliser cette connexion en passant le nom de la chaîne de connexion au constructeur DbContext. Par exemple :

public class NorthwindContext : DbContext
{
    public NorthwindContext()
        : base("name=Northwind_Entities")
    {
    }
}

DbContext sait charger le modèle existant (au lieu d’utiliser Code First pour le calculer à partir du code), car la chaîne de connexion est une chaîne de connexion EF contenant les détails du modèle à utiliser.

Autres options de constructeur DbContext

La classe DbContext contient d’autres constructeurs et modèles d’utilisation qui permettent des scénarios plus avancés. En voici quelques-uns :

  • Vous pouvez utiliser la classe DbModelBuilder pour générer un modèle Code First sans instancier d’instance DbContext. Le résultat est un objet DbModel. Vous pouvez ensuite passer cet objet DbModel à un des constructeurs DbContext quand vous êtes prêt à créer votre instance DbContext.
  • Vous pouvez passer une chaîne de connexion complète à DbContext au lieu de simplement le nom de la base de données ou de la chaîne de connexion. Par défaut, cette chaîne de connexion est utilisée avec le fournisseur System.Data.SqlClient. Cela peut être modifié en définissant une autre implémentation de IConnectionFactory sur context.Database.DefaultConnectionFactory.
  • Vous pouvez utiliser un objet DbConnection existant en le passant à un constructeur DbContext. Si l’objet de connexion est une instance d’EntityConnection, le modèle spécifié dans la connexion est utilisé au lieu de calculer un modèle en utilisant Code First. Si l’objet est une instance d’un autre type, par exemple, SqlConnection, le contexte l’utilise pour le mode Code First.
  • Vous pouvez passer un ObjectContext existant à un constructeur DbContext pour créer un DbContext encapsulant le contexte existant. Cela peut être utilisé pour les applications existantes qui utilisent ObjectContext, mais qui veulent tirer parti de DbContext dans certaines parties de l’application.