Utilisation de DbContext

Pour utiliser Entity Framework pour interroger, insérer, mettre à jour et supprimer des données à l’aide d’objets .NET, vous devez d’abord Créer un modèle qui mappe les entités et relations définies dans votre modèle aux tables d’une base de données.

Une fois que vous avez un modèle, la classe primaire avec laquelle votre application interagit est System.Data.Entity.DbContext (souvent appelée classe de contexte). Vous pouvez utiliser un DbContext associé à un modèle pour :

  • Écrire et exécutez des requêtes
  • Matérialiser les résultats de requête en tant qu’objets d’entité
  • Suivre les modifications apportées à ces objets
  • Conserver les modifications apportées aux objets sur la base de données
  • Lier des objets en mémoire aux contrôles d’interface utilisateur

Cette page fournit des conseils sur la gestion de la classe de contexte.

Définition d’une classe dérivée DbContext

La méthode recommandée pour travailler avec le contexte consiste à définir une classe qui dérive de DbContext et expose les propriétés DbSet qui représentent des collections des entités spécifiées dans le contexte. Si vous travaillez avec EF Designer, le contexte est généré pour vous. Si vous utilisez Code First, vous allez généralement écrire le contexte vous-même.

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

Une fois que vous avez un contexte, vous devez rechercher, ajouter (à l’aide de Add ou de méthodes Attach ) ou supprimer (à l’aide de Remove) des entités dans le contexte via ces propriétés. L’accès à une propriété DbSet sur un objet de contexte représente une requête de départ qui retourne toutes les entités du type spécifié. Notez que l’accès à une propriété n’exécute pas la requête. Une requête est exécutée quand :

  • elle est énumérée par une instruction foreach (C#) ou For Each (Visual Basic) ;
  • Elle est énumérée par une opération de collection telle que ToArray, ToDictionary, ou ToList.
  • Les opérateurs LINQ, tels que First ou Any sont spécifiés dans la partie de la requête la plus à l'extérieur.
  • L’une des méthodes suivantes est appelée : la méthode d’extension Load, DbEntityEntry.Reload, Database.ExecuteSqlCommandet DbSet<T>.Find, si une entité avec la clé spécifiée n’est pas déjà chargée dans le contexte.

Durée de vie

La durée de vie du contexte commence lorsque l'instance est créée et se termine lorsque l'instance est supprimée ou récupérée par le recycleur. Utilisez using si vous souhaitez que toutes les ressources contrôlées par le contexte soient supprimées à la fin du bloc. Si vous utilisez using, le compilateur crée un bloc try/finally automatiquement et appelle la méthode Dispose dans le bloc finally.

public void UseProducts()
{
    using (var context = new ProductContext())
    {     
        // Perform data access using the context
    }
}

Voici quelques indications générales pour décider de la durée de vie du contexte :

  • Lorsque vous utilisez des applications Web, vous utilisez une instance de contexte par demande.
  • Lorsque vous utilisez Windows Presentation Foundation (WPF) ou Windows Forms, vous utilisez une instance de contexte par formulaire. Cela vous permet d'utiliser la fonctionnalité de suivi des modifications fournie par le contexte.
  • Si l’instance de contexte est créée par un conteneur d’injection de dépendances, il incombe généralement au conteneur de supprimer le contexte.
  • Si le contexte est créé dans le code de l’application, n’oubliez pas de supprimer le contexte lorsqu’il n’est plus nécessaire.
  • Si vous utilisez un contexte de longue durée, tenez compte des éléments suivants :
    • Au fur et à mesure que vous chargez des objets et leurs références dans la mémoire, la consommation de mémoire du contexte peut rapidement augmenter. Cela peut provoquer des problèmes de performances.
    • Le contexte n’est pas thread-safe. Par conséquent, il ne doit pas être partagé entre plusieurs threads effectuant du travail simultanément.
    • Si une exception a placé le contexte dans un état irrécupérable, l'ensemble de l'application peut se fermer.
    • Les risques liés à l'exécution dans un état d'accès concurrentiel augmentent à mesure que l'intervalle entre le moment où les données sont interrogées et mises à jour s'allonge.

Connexions

Par défaut, le contexte gère les connexions à la base de données. Le contexte ouvre et ferme les connexions en fonction des besoins. Par exemple, le contexte ouvre la connexion pour exécuter une requête, et ferme la connexion lorsque tous les ensembles de résultats ont été traités.

Dans certains cas, vous souhaiterez avoir davantage de contrôle sur l'ouverture et la fermeture des connexions. Par exemple, lors de l’utilisation de SQL Server Compact, il est souvent recommandé de maintenir une connexion ouverte distincte à la base de données pendant toute la durée de vie de l’application afin d’améliorer les performances. Vous pouvez gérer ce processus manuellement à l'aide de la propriété Connection.