Với Entity Framework hầu hết thời gian SaveChanges()
là đủ. Điều này tạo ra một giao dịch, hoặc tham gia vào bất kỳ giao dịch xung quanh nào và thực hiện tất cả các công việc cần thiết trong giao dịch đó.
Đôi khi mặc dù việc SaveChanges(false) + AcceptAllChanges()
ghép đôi là hữu ích.
Vị trí hữu ích nhất cho việc này là trong các tình huống bạn muốn thực hiện giao dịch phân tán trên hai bối cảnh khác nhau.
Tức là một cái gì đó như thế này (xấu):
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save and discard changes
context1.SaveChanges();
//Save and discard changes
context2.SaveChanges();
//if we get here things are looking good.
scope.Complete();
}
Nếu context1.SaveChanges()
thành công nhưng context2.SaveChanges()
thất bại, toàn bộ giao dịch phân phối bị hủy bỏ. Nhưng thật không may, Entity Framework đã loại bỏ các thay đổi trên context1
, vì vậy bạn không thể phát lại hoặc ghi lại sự thất bại một cách hiệu quả.
Nhưng nếu bạn thay đổi mã của mình thành như thế này:
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save Changes but don't discard yet
context1.SaveChanges(false);
//Save Changes but don't discard yet
context2.SaveChanges(false);
//if we get here things are looking good.
scope.Complete();
context1.AcceptAllChanges();
context2.AcceptAllChanges();
}
Trong khi lệnh gọi SaveChanges(false)
gửi các lệnh cần thiết đến cơ sở dữ liệu, bối cảnh không bị thay đổi, vì vậy bạn có thể thực hiện lại nếu cần hoặc bạn có thể thẩm vấn ObjectStateManager
nếu muốn.
Điều này có nghĩa là nếu giao dịch thực sự ném một ngoại lệ bạn có thể bù, bằng cách thử lại hoặc trạng thái ghi nhật ký của từng bối cảnh ObjectStateManager
ở đâu đó.
Xem bài viết trên blog của tôi để biết thêm.
SaveChanges(fase); ... AcceptAllChanges();
là một mô hình ở nơi đầu tiên. Lưu ý cách câu trả lời được chấp nhận cho câu hỏi trên, được viết bởi tác giả của một blog - và blog đó được tham chiếu trong câu hỏi khác. Tất cả đến với nhau.