Entity Framework - Transakcja
We wszystkich wersjach Entity Framework, za każdym razem, gdy wykonujesz SaveChanges()aby wstawić, zaktualizować lub usunąć bazę danych, platforma otoczy tę operację transakcją. Po wywołaniu SaveChanges kontekst automatycznie rozpoczyna transakcję i zatwierdza ją lub wycofuje w zależności od tego, czy utrwalenie powiodło się.
To wszystko jest dla ciebie przejrzyste i nigdy nie będziesz musiał sobie z tym radzić.
Ta transakcja trwa tylko wystarczająco długo, aby wykonać operację, a następnie zostaje zakończona.
Kiedy wykonasz kolejną taką operację, rozpocznie się nowa transakcja.
Entity Framework 6 zapewnia następujące -
Database.BeginTransaction ()
Jest to prosta i łatwiejsza metoda w ramach istniejącego DbContext do uruchamiania i kończenia transakcji dla użytkowników.
Umożliwia połączenie kilku operacji w ramach tej samej transakcji, a zatem wszystkie są zatwierdzane lub wszystkie są wycofywane jako jedna.
Umożliwia również użytkownikowi łatwiejsze określenie poziomu izolacji transakcji.
Database.UseTransaction ()
Pozwala DbContext na użycie transakcji, która została uruchomiona poza Entity Framework.
Przyjrzyjmy się poniższemu przykładowi, w którym wiele operacji jest wykonywanych w jednej transakcji. Kod jest następujący -
class Program {
static void Main(string[] args) {
using (var context = new UniContextEntities()) {
using (var dbContextTransaction = context.Database.BeginTransaction()) {
try {
Student student = new Student() {
ID = 200,
FirstMidName = "Ali",
LastName = "Khan",
EnrollmentDate = DateTime.Parse("2015-12-1")
};
context.Students.Add(student);
context.Database.ExecuteSqlCommand(@"UPDATE Course SET Title =
'Calculus'" + "WHERE CourseID = 1045");
var query = context.Courses.Where(c ⇒ c.CourseID == 1045);
foreach (var item in query) {
Console.WriteLine(item.CourseID.ToString()
+ " " + item.Title + " " + item.Credits);
}
context.SaveChanges();
var query1 = context.Students.Where(s ⇒ s.ID == 200);
foreach (var item in query1) {
Console.WriteLine(item.ID.ToString()
+ " " + item.FirstMidName + " " + item.LastName);
}
dbContextTransaction.Commit();
} catch (Exception) {
dbContextTransaction.Rollback();
}
}
}
}
}
Rozpoczęcie transakcji wymaga, aby podstawowe połączenie ze sklepem było otwarte.
Dlatego wywołanie Database.BeginTransaction () otworzy połączenie, jeśli nie zostało jeszcze otwarte.
Jeśli DbContextTransaction otworzy połączenie, zamknie je po wywołaniu metody Dispose ().