48

Je voudrais savoir quelle est la meilleure façon d'implémenter des transactions avec DBContext. En particulier,EF Code First DBContext et Transactions

  1. Est-ce que DbContext.SaveChanges met en œuvre une transaction interne si je change plusieurs entités?
  2. Si je veux appeler DbContext.SaveChanges plusieurs fois (même contxet/contxets différents), comment la transaction peut être réalisée?

Répondre

71
  1. Oui. SaveChanges utilise la transaction en interne.
  2. Utilisez TransactionScope pour envelopper plusieurs appels à SaveChanges

Exemple:

using(var scope = new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) 
{ 
    // Do something 
    context.SaveChanges(); 
    // Do something else 
    context.SaveChanges(); 

    scope.Complete(); 
} 
+5

Assurez-vous à l'aide de SQL Server 2008 ou plus tard comme la base de données (ou avoir le service MSDTC en cours d'exécution sur le client). Les versions précédentes vont escalader la transaction vers une transaction distribuée sur le second 'SaveChanges'. Cela est dû à la façon dont 'DbContext' gère en interne l'ouverture et la fermeture de sa connexion. – Lukazoid

+0

Est-il possible d'obtenir une identité à partir des premiers changements de sauvegarde? Je vois toujours Id = 0. – JarrettV

+0

@JarrettV - Je pense que votre problème est dû aux paramètres IsolationLevel. L'abaisser peut aider ... – Sunny

Questions connexes