Entity Framework: Transaktionen und Rollbacks verwenden ... Möglich?

entity-framework transactions

Frage

Ausgabe: (Mit Sql 2005)

  • Wie kann ich die Datenbank abfragen, während die Transaktion läuft? (Da es die Tabelle sperrt)
  • Wie kann eine Transaktion rückgängig gemacht und anschließend geschlossen werden, damit die Tabelle abgefragt werden kann?

Also habe ich so viel gefunden:

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

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

    DataContextHandler.Context.Dispose();
}

Dabei ist DataContextHandler nur ein einfacher Singleton, der das Kontextobjekt für meine Entitäten verfügbar macht. Das scheint so zu funktionieren, wie Sie denken. Es erstellt den Benutzer, speichert und rollt zurück, wenn das Programm beendet ist. (IE Test beendet)

Problem: Wie erzwinge ich, dass die Transaktion rückgängig gemacht wird und sich selbst beendet, damit ich die Tabelle abfragen kann?

Grund: Zu Testzwecken möchte ich sicherstellen, dass der Benutzer:

  • Ist gespeichert
  • Kann korrekt abgefragt werden, um seine Existenz nachzuweisen
  • Wird entfernt (Junk-Daten)
  • Kann abgefragt werden, um sicherzustellen, dass es entfernt wurde.

Ab sofort kann ich die Transaktion nur dann zurückrollen lassen, wenn der Test endet UND ich nicht herausfinden kann, wie mit der Transaktion abgefragt wird:

[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 Dies funktionierte für das Zurücksetzen und Überprüfen, konnte jedoch im Abfrageabschnitt nicht abgefragt werden:

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);

Beliebte Antwort

Von MSDN ;

"SaveChanges wird innerhalb einer Transaktion ausgeführt. SaveChanges führt einen Rollback dieser Transaktion durch und gibt eine Ausnahme aus, wenn eines der fehlerhaften ObjectStateEntry-Objekte nicht persistiert werden kann."

Es scheint also, dass es nicht notwendig ist, Ihre eigene Transaktionsabwicklung durch TransactionScope explizit hinzuzufügen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum