2009-07-01 23 views
9
string[] usersToAdd = new string[] { "asd", "asdert", "gasdff6" }; 
using (Entities context = new Entities()) 
{ 
    foreach (string user in usersToAdd) 
    { 
     context.AddToUsers(new User { Name = user }); 
    } 
    try 
    { 
     context.SaveChanges(); //Exception thrown: user 'gasdff6' already exist. 
    } 
    catch (Exception e) 
    { 
     //Roll back all changes including the two previous users. 
    } 

Hoặc có thể điều này được thực hiện tự động, có nghĩa là nếu xảy ra lỗi, cam kết thay đổi sẽ bị hủy đối với tất cả thay đổi. là nó?Cách quay lại giao dịch trong Entity Framework

Trả lời

12

OK

Tôi tạo ra một mẫu một ứng dụng giống như ví dụ từ câu hỏi và bạt Tôi đã kiểm tra trong DB và không sử dụng được thêm vào.

Kết luận: ObjectContext.SaveChange nó tự động là một giao dịch.

Lưu ý: Tôi tin rằng giao dịch sẽ là cần thiết nếu sprocs thực hiện, vv

+0

có điều này là chính xác –

8

Tôi tin (nhưng tôi không có chuyên gia lâu năm trong EF) cho đến khi cuộc gọi đến ngữ cảnh. Lưu ý, các giao dịch không được bắt đầu. Tôi mong đợi một Ngoại lệ từ cuộc gọi đó sẽ tự động khôi phục bất kỳ giao dịch nào mà nó đã bắt đầu. Giải pháp thay thế (trong trường hợp bạn muốn kiểm soát giao dịch) [từ J.Lerman's "Programming Entity Framework" O'Reilly, pg. 618]

using (var transaction = new System.Transactions.TransactionScope()) 
{ 
    try 
    { 
    context.SaveChanges(); 
    transaction.Complete(); 
    context.AcceptAllChanges(); 
    } 
    catch(OptimisticConcurrencyException e) 
    { 
    //Handle the exception 
    context.SaveChanges(); 
    } 
} 

hoặc

bool saved = false; 
using (var transaction = new System.Transactions.TransactionScope()) 
{ 
    try 
    { 
    context.SaveChanges(); 
    saved = true; 
    } 
    catch(OptimisticConcurrencyException e) 
    { 
    //Handle the exception 
    context.SaveChanges(); 
    } 
    finally 
    { 
    if(saved) 
    { 
     transaction.Complete(); 
     context.AcceptAllChanges(); 
    } 
    } 

} 
+0

"Tôi tin" rằng những gì? – Shimmy

+0

Về bản chất, tôi tin rằng bạn nhận được rollback giao dịch miễn phí trong kịch bản đơn giản và bạn sẽ cần xử lý các giao dịch như được minh họa trong hai ví dụ cho các tình huống phức tạp hơn. Ứng dụng mẫu của bạn dường như xác nhận điều này. Xin lỗi nếu từ ngữ của tôi ít hơn sao - đã ở giữa các cuộc họp khi tôi viết bài này hôm qua. – FOR

Các vấn đề liên quan