2011-02-21 10 views
13

sự khác biệt giữa những điều sau là gì:LINQ to Entity AcceptAllChanges SaveChanges

 db.AcceptAllChanges(); 
     // vs 
     db.SaveChanges(); 

     db.AddToCustomer() 
     // vs 
     db.Customers.AddObject(Mycustomer); 

và tại sao có db.Customers.DeleteObject(Mycustomer); và không db.DeleteFromCustomer(Mycustomer);

khi tôi nên sử dụng mỗi người?

cũng là khung thực thể an toàn? tôi có nghĩa là nếu hai chủ đề cập nhật các đối tượng trong bối cảnh sametime nó sẽ sụp đổ?

cảm ơn trước

Trả lời

12

db.AcceptAllChanges() giả sử bạn đã kết thúc với bất kỳ lịch sử thay đổi được kết hợp nào và loại bỏ lịch sử đó - nếu bạn gặp thêm bất kỳ sự cố nào, bạn không thể khôi phục những thay đổi đó. db.SaveChanges(false) không giữ những thay đổi trong bộ nhớ trong trường hợp có vấn đề.

Xem http://blogs.msdn.com/b/alexj/archive/2009/01/11/savechanges-false.aspx để có câu trả lời chi tiết hơn.

db.AddToCustomer() là trình bao bọc được nhập mạnh mẽ xung quanh db.Customers.AddObject(). Nhìn vào định nghĩa của nó và bạn sẽ thấy những gì tôi có ý nghĩa. Tôi sẽ sử dụng phương pháp db.AddToCustomer() hoàn toàn vì nó được gõ mạnh mẽ và cho phép bạn kiểm tra kiểu thời gian biên dịch.

Tôi tưởng tượng lý do duy nhất tại sao không có DeleteFromCustomer() là họ không nghĩ rằng công việc sẽ là cần thiết (mọi người có xu hướng thêm nhiều hơn là họ xóa). Không có gì ngăn bạn tạo ra các phương thức mở rộng của riêng bạn để tự mình thực hiện nó.

EF không phải là chủ đề an toàn, nếu bạn muốn thực hiện các cập nhật, bạn cần tự quản lý khóa. Xem http://blog.cincura.net/230902-multithreading-with-entity-framework/ để biết thêm)

+0

AddObject cũng được nhập mạnh vì đó là phương pháp kiểu chung ObjectSet - trong trường hợp này ObjectSet và definiton của phương thức là AddObject (thực thể khách hàng). –

9

AcceptAllChanges chỉ tập hợp tất cả các đơn vị bổ sung và sửa đổi trong ObjectContextStateManager dụ để Unchanged nhà nước và tách tất cả các đơn vị bị xóa nhưng nó đã không thực hiện những thay đổi trong cơ sở dữ liệu. SaveChanges thực thi các thay đổi trong cơ sở dữ liệu và theo mặc định cũng chấp nhận các thay đổi (có thể được cấu hình để không thực hiện).

AddToCustomer cũng giống như Customers.AddObject - nó chỉ là một phím tắt (giống với DeleteObject). Phương thức đầu tiên được tạo bởi trình tạo mã (và tôi nghĩ nó được gọi là phương thức thứ hai là phương thức chuẩn của ObjectSet).

Khuôn khổ đối tượng không phải là chuỗi an toàn. Hơn nữa, bạn nên là very careful khi chia sẻ ObjectContext trong một số chuỗi.