Я использую контекст Entity Framework и иногда хотел бы создать транзакцию, чтобы клиент мог сделать несколько изменений, а затем зафиксировать / откатить их все вместе.
Однако, если было сделано много изменений, и SaveChanges () вызывался несколько раз, после чего вызывался откат, сущности, которые уже были зафиксированы, останутся такими же, как они были зафиксированы, и не будут откатываться.
Вот как выглядят мои функции, относящиеся к транзакциям:
Public Sub BeginTransaction()
Dim context = HttpContext.Current.GetObjectContext()
If Not context.Connection.State = ConnectionState.Open Then
context.Connection.Open()
End If
Dim trasnaction = context.Connection.BeginTransaction()
HttpContext.Current.Items("transaction") = trasnaction
End Sub
Public Sub CommitTransaction()
Dim transaction = CType(HttpContext.Current.Items("transaction"), DbTransaction)
transaction.Commit()
HttpContext.Current.Items("transaction") = Nothing
End Sub
Public Sub RollbackTransaction()
Dim transaction = CType(HttpContext.Current.Items("transaction"), DbTransaction)
transaction.Rollback()
HttpContext.Current.Items("transaction") = Nothing
End Sub
И затем я запускаю следующий тест:
Public Sub TransactionsTest()
Dim context = GetObjectContext()
Dim firstString = context.LocalizedStrings.Where(Function(ls) ls.ID = 4).First()
Dim secondString = context.LocalizedStrings.Where(Function(ls) ls.ID = 5).First()
Dim firstStringOriginal = firstString.Text
Try
DatabaseProvider.BeginTransaction()
firstString.Text = "blabla"
context.SaveChanges() //Saves OK
Dim caughExeption = False
Try
secondString.LanguageID = "suka"
context.SaveChanges() //Doesn't save, because change is invalid
DatabaseProvider.CommitTransaction()
Catch ex As Exception
DatabaseProvider.RollbackTransaction()
caughExeption = True
End Try
Assert.IsTrue(caughExeption)
// Try to retrieve the first string again
firstString = context.LocalizedStrings.Where(Function(ls) ls.ID = 4).First()
Assert.AreEqual(firstStringOriginal, firstString.Text) // FAILS :(
Finally
firstString.Text = firstStringOriginal
context.SaveChanges()
End Try
End Sub
Любая помощь будет высоко ценится, спасибо.
Мало того, что тест не пройден, но он также оставляет ObjectContext в нестабильном режиме, потому что в нем все еще есть недопустимые изменения.