2009-11-18 18 views
15

Hãy xem xét kịch bản này thường bị ngắt kết nối:LINQ Để ngoại lệ SQL với Đính kèm(): Không thể thêm một thực thể với một chìa khóa đó là đã được sử dụng

  • tải một đối tượng khách hàng từ SQL Server sử dụng LINQ to SQL
  • người dùng chỉnh sửa thực thể và tầng trình bày gửi lại thực thể đã sửa đổi.
  • lớp dữ liệu, sử dụng L2S, phải gửi những thay đổi SQL Server

xem xét LINQ này Để truy vấn SQL có ý định là để có một thực thể khách hàng.

Cust custOrig = db.Custs.SingleOrDefault(o => o.ID == c.ID); //get the original 
db.Custs.Attach(c, custOrig); //we don't have a TimeStamp=True property 
db.SubmitChanges();     

DuplicateKeyException: Cannot add an entity with a key that is already in use.

alt text

Câu hỏi

  • Làm thế nào bạn có thể tránh ngoại lệ này?
  • Chiến lược tốt nhất để cập nhật thực thể KHÔNG có/muốn/cần thuộc tính dấu thời gian là gì?

Sub-Optimal Cách giải quyết

  • tự đặt mỗi tài sản trong khách hàng được cập nhật cho khách hàng orig.
  • quay lên một DataContext

Trả lời

23

này đã làm với thực tế là DataContext của bạn (db) không thể theo dõi cùng một thực thể nhiều hơn một lần. Xem this post để biết thêm chi tiết về những gì đang xảy ra.

Một trong những ý kiến ​​che khuất ở dưới cùng của bài nói rằng thử:

public void Update(Customer customer) 
{ 
    NorthwindDataContext context = new NorthwindDataContext(); 
    context.Attach(customer); 
    context.Refresh(RefreshMode.KeepCurrentValues, customer); 
    context.SubmitChanges(); 
} 

Hãy cho tôi biết thế nào nó hoạt động ra cho bạn, như OP của bài nói rằng nó làm việc ra cho anh ta .. .

+0

+1; cảm ơn! Điều đó đã thực sự làm việc! Tôi sẽ để lại câu hỏi này 'chưa được trả lời' cho bây giờ, nhưng câu trả lời này chắc chắn giải quyết được vấn đề! –

+0

Như JustLoren nói Đính kèm là có cho một bối cảnh một thực thể nó chưa có - nó không thể được sử dụng để thay thế một. Trong một tình huống điển hình nếu bạn đang nhận được một đối tượng trở lại nó là đôi khi sau đó và sẽ được gắn vào một bối cảnh dữ liệu mới. – DamienG

-4

Thay vì tạo ra một bối cảnh mới, bạn có thể làm điều này:

public void Update(Customer customer) 
{ 
    Customer oldCustomer= db.Custs.First(c => c.ID == customer.ID); //retrieve unedited 
    oldCustomer = customer; // set the old customer to the new customer. 
    db.SubmitChanges(); //sumbit to database 
} 
+1

Điều đó sẽ không cập nhật cơ sở dữ liệu, nó sẽ chỉ thay đổi những gì biến cũCustomer đề cập đến. – Haukman

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