Share via


Gestion des connexions et des transactions (Entity Framework)

Par défaut, Entity Framework gère la connexion à la base de données. Toutefois, vous pouvez gérer les connexions et les transactions manuellement dans votre application Entity Framework .

Connexions et Entity Framework

Entity Framework ouvre des connexions uniquement si requis, par exemple, pour exécuter une requête ou appeler SaveChanges, et ferme la connexion lorsque l'opération est terminé.

L'appel d'une des méthodes suivantes ouvre la connexion :

Bb896325.note(fr-fr,VS.100).gifRemarque :
Lorsqu'une méthode de requête est appelée, la connexion est ouverte et elle reste ouverte jusqu'à ce que l'objet ObjectResult ait été complètement consommé ou supprimé.

Gestion de connexions manuelle

Entity Framework expose EntityConnection via la propriété Connection. Cela vous permet de gérer la connexion et les transactions ou de fournir votre propre EntityConnection. Cela est utile lorsque vous souhaitez maintenir ouverte une connexion dans un contexte d'objet à courte durée de vie pour améliorer les performances ou contrôler explicitement les transactions. Une même connexion de fournisseur utilisée par Entity Framework peut être partagée avec d'autres parties d'une application. L'exemple suivant montre comment ouvrir explicitement une connexion.

' Explicitly open the connection. 
context.Connection.Open()
// Explicitly open the connection.    
context.Connection.Open();

Pour plus d'informations, voir Procédure : ouvrir manuellement la connexion à partir du contexte de l'objet (Entity Framework).

Lorsque vous ouvrez manuellement la connexion dans un contexte d'objet long, vous devez appeler la méthode Dispose pour garantir la fermeture de la connexion lorsque le contexte n'est plus requis. Vous pouvez également appeler la méthode Close sur l'objet EntityConnection pour fermer explicitement la connexion. Pour plus d'informations, consultez Procédure : gérer la connexion dans un contexte d'objet long (Entity Framework).

Vous pouvez également créer un EntityConnection et fournir cette connexion au contexte d'objet. Dans ce cas, vous pouvez ouvrir la connexion manuellement ou autoriser le contexte d'objet à l'ouvrir, si nécessaire. Une fois que vous avez fourni l'objet EntityConnection au contexte d'objet, vous devez vous assurer que le contexte et l'objet EntityConnection sont supprimés lorsqu'ils ne sont plus requis. L'exemple suivant crée une connexion et la transmet au contexte d'objet :

' Create an EntityConnection. 
Dim conn As New EntityConnection("name=AdventureWorksEntities")

' Create a long-running context with the connection. 
Dim context As New AdventureWorksEntities(conn)
// Create an EntityConnection.
EntityConnection conn =
    new EntityConnection("name=AdventureWorksEntities");

// Create a long-running context with the connection.
AdventureWorksEntities context =
    new AdventureWorksEntities(conn);

Pour plus d'informations, consultez Procédure : utiliser EntityConnection avec un contexte d'objet (Entity Framework).

Considérations sur la gestion des connexions

Les considérations suivantes s'appliquent lors de la gestion des connexions :

  • Le contexte d'objet ouvrira la connexion si elle n'est pas déjà ouverte avant une opération. Si le contexte d'objet ouvre la connexion pendant une opération, il fermera toujours la connexion une fois l'opération terminée.

  • Si vous ouvrez manuellement la connexion, le contexte d'objet ne la fermera pas. L'appel de Close ou de Dispose fermera la connexion.

  • Si le contexte d'objet crée la connexion, la connexion sera toujours supprimée lorsque le contexte sera supprimé.

  • Dans un contexte d'objet long, vous devez garantir la suppression du contexte lorsqu'il n'est plus requis.

Si vous fournissez un objet EntityConnection ouvert pour le contexte d'objet, vous devez vous assurer qu'il est supprimé.

Transactions et Entity Framework

Entity Framework prend en charge l'inscription automatique des transactions. Cela signifie que les activités effectuées dans un contexte d'objet, telles que l'exécution de requêtes et l'enregistrement de modifications apportées aux données de la source de données, peuvent être isolées dans la source de données en exécutant l'opération dans le cadre d'une transaction System.Transactions. Les transactions sont utilisées dans Entity Framework pour effectuer les actions suivantes :

  • Exécuter plusieurs opérations sur la source de données qui doivent être très cohérentes, comme les requêtes qui dépendent de l'issue positive de modifications d'objets.

  • Coordonner les modifications dans le contexte de l'objet avec d'autres opérations distribuées, comme l'envoi d'une notification par courrier électronique ou l'écriture dans une file d'attente de messages.

Les transactions qui requièrent l'inscription de gestionnaires de ressources supplémentaires sont appelées des transactions distribuées. Les transactions distribuées utilisent un Distributed Transaction Coordinator pour gérer les ressources requises pour réaliser la transaction. La promotion d'une transaction à un Distributed Transaction Coordinator peut être un processus relativement coûteux à établir et réaliser. Certains Gestionnaires des ressources, comme SQL Server 2005, prennent en charge le protocole de transaction PSPE (Promotable Single Phase Enlistment). Un Gestionnaire des ressources peut alors héberger une transaction qui peut ensuite, si nécessaire, être gérée par le Distributed Transaction Coordinator.

Pour plus d'informations sur System.Transactions, consultez Transaction Processing. Pour plus d'informations sur l'utilisation de System.Transactions avec SQL Server, consultez System.Transactions Integration with SQL Server (ADO.NET).

Considérations sur la gestion des transactions

Vous devez tenir compte des points suivants lors de l'utilisation de transactions avec Entity Framework  :

  • Seules les opérations sur la source de données peuvent faire l'objet d'une transaction. Les modifications apportées aux objets dans le contexte de l'objet ne font pas l'objet d'une transaction. Les modifications apportées aux objets dans le contexte sont visibles en dehors de la portée de la transaction.

  • Lorsque vous appelez la méthode SaveChanges, si une transaction en cours existe, Entity Framework utilise cette transaction pour les opérations sur la source de données. Sinon, il crée une transaction pour l'opération. Vous pouvez définir des transactions à l'aide de EntityTransaction, Transaction, ou TransactionScope.

    Bb896325.note(fr-fr,VS.100).gifRemarque :
    Pour s'inscrire dans une transaction existante, Entity Framework peut fermer et rouvrir la connexion.

  • Lorsqu'Entity Framework crée une transaction pour une opération SaveChanges, les modifications apportées aux objets dans le contexte de l'objet ne sont pas acceptées tant que la transaction n'est pas terminée. Cela garantit la cohérence d'état entre le contexte de l'objet et la source de données.

  • La promotion d'une transaction à un Distributed Transaction Coordinator peut se produire lorsqu'une connexion est fermée et rouverte dans une transaction unique. Étant donné qu'Entity Framework ouvre et ferme automatiquement la connexion, vous devez envisager d'ouvrir et de fermer manuellement la connexion pour éviter la promotion des transactions. Pour plus d'informations, consultez Procédure : ouvrir manuellement la connexion à partir du contexte de l'objet (Entity Framework).

  • Lorsque vous projetez de réessayer des opérations dans une transaction, vous devez vous assurer que l'état des objets dans le contexte n'est pas réinitialisé avant que la transaction soit effectuée. Pour ce faire, vous devez appeler la méthode SaveChanges avec une valeur false pour le paramètre acceptChangesDuringSave, puis appeler la méthode AcceptAllChanges uniquement à l'issue des autres opérations de la transaction. Pour plus d'informations, voir Procédure : gérer les transactions dans Entity Framework.

Dans le cadre d'une nouvelle tentative avec des transactions coordonnées, vous pouvez appeler la méthode SaveChanges une seconde fois sans commencer par appeler la méthode AcceptAllChanges. Dans ce cas, Entity Framework essaiera d'appliquer de nouveau les mêmes modifications à la source de données.

Dans cette section

Procédure : ouvrir manuellement la connexion à partir du contexte de l'objet (Entity Framework)

Procédure : gérer la connexion dans un contexte d'objet long (Entity Framework)

Procédure : utiliser EntityConnection avec un contexte d'objet (Entity Framework)

Procédure : gérer les transactions dans Entity Framework