Entity Framework: Utilisation de transactions et de restaurations ... possible?

entity-framework transactions

Question

Problème: (avec SQL 2005)

  • Comment interroger la base de données lorsque la transaction est en cours? (Depuis qu'il verrouille la table)
  • Comment une transaction peut-elle être restaurée puis se fermer pour permettre à la table d'être interrogée?

Alors j'ai trouvé ça beaucoup:

[TestMethod]
public void CreateUser()
{
    TransactionScope transactionScope = new TransactionScope();

    DataContextHandler.Context.AddToForumUser(userToTest);
    DataContextHandler.Context.SaveChanges();

    DataContextHandler.Context.Dispose();
}

Où DataContextHandler n'est qu'un simple singleton qui expose l'objet de contexte pour mes entités. Cela semble fonctionner comme vous le pensez. Il crée l'utilisateur, enregistre, puis revient à la fin du programme. (IE test termine)

Problème: Comment forcer la transaction à s’annuler et à se tuer pour pouvoir interroger la table?

Raison: à des fins de test, je veux m'assurer que l'utilisateur:

  • Est sauvé
  • Peut être interrogé correctement pour prouver son existence
  • Est supprimé (données indésirables)
  • Peut être demandé pour s'assurer qu'il a été supprimé.

À l'heure actuelle, je ne peux obtenir l'annulation de la transaction que si le test se termine ET je ne vois pas comment interroger la transaction:

[TestMethod]
public void CreateUser()
{
    ForumUser userToTest = new ForumUser();

    TransactionScope transactionScope = new TransactionScope();

    DataContextHandler.Context.AddToForumUser(userToTest);
    DataContextHandler.Context.SaveChanges();     

    Assert.IsTrue(userToTest.UserID > 0);

    var foundUser = (from user in DataContextHandler.Context.ForumUser
                    where user.UserID == userToTest.UserID
                    select user).Count();  //KABOOM Can't query since the 
                                           //transaction has the table locked.

    Assert.IsTrue(foundUser == 1);

    DataContextHandler.Context.Dispose();

    var after = (from user in DataContextHandler.Context.ForumUser
                 where user.UserID == userToTest.UserID
                 select user).Count(); //KABOOM Can't query since the 
                                       //transaction has the table locked.

    Assert.IsTrue(after == 0);
}

UPDATE Cela a fonctionné pour restaurer et vérifier, mais ne peut toujours pas interroger dans la section using:

using(TransactionScope transactionScope = new TransactionScope())
{
    DataContextHandler.Context.AddToForumUser(userToTest);
    DataContextHandler.Context.SaveChanges();
    Assert.IsTrue(userToTest.UserID > 0);
    //Still can't query here.

}

var after = (from user in DataContextHandler.Context.ForumUser
            where user.UserID == userToTest.UserID
            select user).Count();

Assert.IsTrue(after == 0);

Réponse populaire

De MSDN ;

"SaveChanges fonctionne dans une transaction. SaveChanges annule cette transaction et lève une exception si aucun des objets ObjectStateEntry ne peut pas être conservé."

Il semble donc qu'il ne soit pas nécessaire d'ajouter explicitement votre propre traitement de transaction via TransactionScope .



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi