2013-06-04 25 views
5

Tôi đang thực thi mã trong ngữ cảnh riêng của chúng, nhưng nó làm cho dữ liệu không đồng bộ trong ngữ cảnh chủ đề chính. Vì vậy, tôi cần phải làm mới các thực thể sau khi các bối cảnh khác hoàn thành công việc của họ trước khi tôi có thể cập nhật nó.Thực thể có thể đã được sửa đổi hoặc xóa vì các thực thể đã được tải

Thật không may, tôi đang nhận được OptimisticConcurrencyException và không thể tìm ra thực thể nào là vấn đề và cần được làm mới? Có cách nào để tìm ra thực thể nào đang gây ra OptimisticConcurrencyException không? Thông báo này không phải là hữu ích ở tất cả ...

System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Lưu trữ cập nhật, chèn hoặc xóa tuyên bố bị ảnh hưởng một số bất ngờ của hàng (0). Các thực thể có thể đã được sửa đổi hoặc bị xóa vì các đối tượng đã được tải. Làm mới các mục ObjectStateManager. ---> System.Data.OptimisticConcurrencyException: Cập nhật cửa hàng, chèn hoặc câu lệnh xóa ảnh hưởng đến số hàng không mong muốn (0). Các đối tượng có thể đã được sửa đổi hoặc bị xóa vì các thực thể đã được tải. Làm mới mục nhập Trình quản lý đối tượng.

+0

Có thể, thuộc tính 'DbUpdateConcurrencyException.Entries' có thể giúp phát hiện các thực thể chưa được lưu. –

Trả lời

0

Có lẽ giải pháp tốt nhất là chỉ tạo một context mới trong ngữ cảnh chủ đề chính sau khi các chủ đề khác đã hoàn thành.

Nếu không, nếu bạn cần sử dụng lại context, đây là phương pháp hữu ích để làm mới các đối tượng ngữ cảnh của bạn.

public void RefreshAll() 
    { 
     // Get all objects in state manager with entityKey 
     // (context.Refresh will throw an exception otherwise) 
     var refreshableObjects = (from entry in 
       ObjectContext.ObjectStateManager.GetObjectStateEntries(
                EntityState.Deleted 
                | EntityState.Modified 
                | EntityState.Unchanged) 
            where entry.EntityKey != null 
            select entry.Entity); 

     ObjectContext.Refresh(RefreshMode.StoreWins, refreshableObjects); 
    } 
Các vấn đề liên quan