Comment utiliser les transactions avec Entity Framework?

entity-framework transactions

Question

Quand vous avez un code comme celui-ci:

Something something = new Something();
BlahEntities b = new BlahEntities()    
b.AddToSomethingSet(something);
b.SaveChanges();

comment exécuter cette addition dans une transaction?

Réponse acceptée

Vous pouvez placer votre code dans une portée de transaction

using(TransactionScope scope = new TransactionScope())
{
    // Your code
    scope.Complete(); //  To commit.
}

TransactionScope se trouve dans l'espace de noms System.Transactions qui se trouve dans l'assembly du même nom (que vous devrez éventuellement ajouter manuellement à votre projet).


Réponse populaire

ObjectContext a une propriété de connexion que vous pouvez utiliser pour gérer les transactions.

using (var context = new BlahEntities())
using (var tx = context.BeginTransaction())
{
    // do db stuff here...
    tx.Commit();
}

Dans le cas d'une exception, la transaction sera annulée. Comme l'appel à BeginTransaction () requiert une connexion ouverte, il est logique d'envelopper l'appel à BeginTransaction éventuellement dans une méthode d'extension.

public static DbTransaction BeginTransaction(this ObjectContext context)
{
    if (context.Connection.State != ConnectionState.Open)
    {
        context.Connection.Open();
    }
    return context.Connection.BeginTransaction();
}

Un scénario dans lequel, selon moi, cette approche pourrait être utile avec TransactionScope est lorsque vous devez accéder à deux sources de données et n’avez besoin que d’un contrôle transactionnel sur l’une des connexions. Je pense que dans ce cas, TransactionScope sera promu en une transaction distribuée qui pourrait ne pas être requise.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow