Khung thực thể - Giao dịch
Trong tất cả các phiên bản của Entity Framework, bất cứ khi nào bạn thực thi SaveChanges()để chèn, cập nhật hoặc xóa cơ sở dữ liệu, khuôn khổ sẽ bao bọc hoạt động đó trong một giao dịch. Khi bạn gọi SaveChanges, ngữ cảnh sẽ tự động bắt đầu một giao dịch và cam kết hoặc khôi phục nó tùy thuộc vào việc duy trì có thành công hay không.
Tất cả điều này là minh bạch đối với bạn và bạn sẽ không bao giờ cần phải xử lý nó.
Giao dịch này chỉ kéo dài đủ lâu để thực hiện hoạt động và sau đó hoàn tất.
Khi bạn thực hiện một thao tác khác như vậy, một giao dịch mới sẽ bắt đầu.
Entity Framework 6 cung cấp những điều sau:
Database.BeginTransaction ()
Đây là một phương pháp đơn giản và dễ dàng hơn trong DbContext hiện có để bắt đầu và hoàn thành các giao dịch cho người dùng.
Nó cho phép một số hoạt động được kết hợp trong cùng một giao dịch và do đó tất cả đều được cam kết hoặc tất cả được thu hồi lại làm một.
Nó cũng cho phép người dùng dễ dàng chỉ định mức cô lập cho giao dịch.
Database.UseTransaction ()
Nó cho phép DbContext sử dụng một giao dịch, được bắt đầu bên ngoài Entity Framework.
Chúng ta hãy xem xét ví dụ sau trong đó nhiều thao tác được thực hiện trong một giao dịch. Mã là -
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();
}
}
}
}
}
Bắt đầu giao dịch yêu cầu kết nối cửa hàng cơ bản phải mở.
Vì vậy, việc gọi Database.BeginTransaction () sẽ mở kết nối, nếu nó chưa được mở.
Nếu DbContextTransaction đã mở kết nối thì nó sẽ đóng nó khi Dispose () được gọi.