2013-03-22 32 views
6

Tôi cố gắng loại bỏ một số thay đổi với chức năng tải lại. Tôi nhận được InvalidOperationException. Làm cách nào để ngăn chặn điều này?Khuôn khổ thực thể 5 InvalidOperationException trên Tải lại

DbContext.SaveChanges(); 
//Entity is in Unchanged state 
//Make some changes to an entity 
//Change state to modified 
DbContext.Entry(entity).Reload(); 

InvalidOperationException
EntityMemberChanged hoặc EntityComplexMemberChanged được gọi mà không đầu tiên gọi EntityMemberChanging hoặc EntityComplexMemberChanging trên theo dõi sự thay đổi tương tự với tên thuộc tính tương tự. Để biết thông tin về việc thay đổi báo cáo đúng cách, hãy xem tài liệu Entity Framework .

EDIT:
Tôi đã kích hoạt và tàn tật ProxyCreationEnabled, LazyLoadingEnabled.
Đã thử các cách tiếp cận khác nhau. Tất cả những nỗ lực này ném cùng một ngoại lệ.

var objContext = ((IObjectContextAdapter)context).ObjectContext; 
objContext.Refresh(RefreshMode.ClientWins, entry.Entity); 


entry.OriginalValues.SetValues(entry.GetDatabaseValues()); 

Hope tôi nhận được một giải pháp. Không muốn vứt bỏ toàn bộ DbContext để tải lại tất cả dữ liệu.

+1

Có bất kỳ trợ giúp nào trong số những trợ giúp này không? http://stackoverflow.com/questions/5221314/refresh-entity-instance-with-dbcontext hoặc http://stackoverflow.com/questions/5799737/entity-framework-4-1-dbset-reload hoặc http này: //connect.microsoft.com/VisualStudio/feedback/details/694567/entitymemberchanged-or-entitycomplexmemberchanged-was-called-without-first-calling-entitymemberchanging-or-entitycomplexmemberchanging-on-the-same-change-tracker-with- the-same-property-name ?? – LiverpoolsNumber9

+0

Điều này có thể không liên quan gì đến tình huống của bạn, nhưng muốn kiểm tra .. Bạn có đang thực hiện bất kỳ loại đa luồng/không đồng bộ nào trong chương trình của mình không? Giống như sử dụng bất kỳ PLINQ hoặc 4.5 async/await? – tostringtheory

+0

@tostringtheory Allready đã kiểm tra nó mà không cần bất kỳ luồng nào. Cùng một vấn đề. –

Trả lời

2

Để báo this MSDN thread/post

"nó đáng chú ý là các lỗi xuất hiện hay không, bạn sử dụng thay đổi theo dõi một thông qua một lớp proxy hoặc gọi entitymemberchanged một cách rõ ràng. Tôi dường như nhận được lỗi bất cứ khi nào tôi thực hiện entitymemberchanging và thay đổi trên aa chủ đề bên ngoài một trong đó tạo ra các objectcontext/objectstatemanager, bất kể tôi thực hiện hai chức năng đồng bộ hoặc không đồng bộ, sử dụng ổ khóa hoặc có thread ngủ một cách rõ ràng.Tôi xảy ra với tôi rằng đây là một số loại "lỗi chính hãng" với objectstatemanager và không phải thứ gì đó mà sẽ có một giải pháp đơn giản. Quả bóng trong tòa án của bạn, MSFT. "

P.S. Quá dài để nhận xét.

+0

ok cảm ơn. Tôi đã thực hiện một cách giải quyết khác. –

0

Nếu mã là khi bạn đăng nó, nơi đối tượng được tải từ một DbContext, sau đó tải lại từ cùng một DbContext, bạn không nên đánh dấu rõ ràng nó như đã sửa đổi; việc thay đổi đối tượng là đủ để đánh dấu nó là Đã sửa đổi rồi. Nói cách khác:

var o = new SimpleObject { Stuff = "One" }; 
db.SimpleObjects.Add(o); 
db.SaveChanges(); 

o.Stuff = "Two"; // implicitly marks as Modified for you, since it's still Attached 

// Unnecessary 
//db.Entry(o).State = System.Data.EntityState.Modified; 

db.Entry(o).Reload(); // Works for me 
0

Tôi thấy rằng tải lại không thành công trên các thực thể proxy có thuộc tính điều hướng.

Là một công trình xung quanh, thiết lập lại các giá trị hiện tại và sau đó tải lại như thế này:

var entry = DbContext.Entry(entity); 
entry.CurrentValues.SetValues(entry.OriginalValues); 
entry.Reload(); 
0

tôi đã có một tình huống tương tự, với mô tả cùng một ngoại lệ. Trong trường hợp của tôi, tôi đã cố gắng xóa một thực thể khỏi bối cảnh, và bằng cách nào đó nó liên quan đến một trình xử lý được thay đổi vẫn đang được gọi.

Tôi chỉ lấy ra xử lý trước khi tháo các thực thể từ bối cảnh với

MyEntity.PropertyChanged -= MyPropertyChangedHandler; 
context.MySet.Remove(MyEntity); //it works after removing the handler 

Hope this helps một ai đó.

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