Entity framework “如何修复”;调用EntityMemberChanged时未首先调用EntityMemberChanged“EntityMemberChanged”;
我们一次又一次地想到这件事。在阅读了这样一条消息之后,没有什么直观的操作和调试方法。这个记录不良的错误试图说明的是,您意外地设置了一个系统,其中跟踪更改会导致更多更改 当Entity Framework更改某个实体上的属性时,例如在使用标识ID更新保存更改期间,您运行了更改其他跟踪属性的代码 例如,实体框架正在设置的属性触发了一个事件,可能是Entity framework “如何修复”;调用EntityMemberChanged时未首先调用EntityMemberChanged“EntityMemberChanged”;,entity-framework,Entity Framework,我们一次又一次地想到这件事。在阅读了这样一条消息之后,没有什么直观的操作和调试方法。这个记录不良的错误试图说明的是,您意外地设置了一个系统,其中跟踪更改会导致更多更改 当Entity Framework更改某个实体上的属性时,例如在使用标识ID更新保存更改期间,您运行了更改其他跟踪属性的代码 例如,实体框架正在设置的属性触发了一个事件,可能是INotifyPropertyChanged,该事件可能是由BindingSource或某个绑定列表订阅的,其ListChanged事件处理程序位于UI中,
INotifyPropertyChanged
,该事件可能是由BindingSource
或某个绑定列表订阅的,其ListChanged
事件处理程序位于UI中,并触发了某个其他属性的计算,更改跟踪器检测到第二个属性更改
简单的诊断方法是在SaveChanges()调用上放置一个断点,并在SaveChanges()调用之后立即放置一个断点。当第一个断点被命中时,在每个可能被触发的事件处理程序上放置一个断点。(BindingSources
以相互相乘事件而臭名昭著。)继续调试。如果遇到除SaveChanges之后的断点之外的任何断点,您都知道问题所在
简单的解决方案是在SaveChanges调用的每一侧设置一个标志,例如IsSaving
。然后,在每个行为不端的事件处理程序中,进行简单检查,如果DbContext正在保存,则不要修改任何实体。确保最后使用
,以防SaveChanges引发在更高级别捕获的异常:
IsSaving = true;
try
{
await db.SaveChangesAsync()
}
finally
{
IsSaving = false;
}
(另一种可能性是,您正在从多个线程更改实体-永远不要在多个线程中涉及更改跟踪器!)我遇到了完全相同的问题。我已连接到INotifyPropertyChanged事件,该事件创建了在SaveChanges()调用期间更改属性的可能性。我认为在执行dbContext.SaveChanges(),Remove()时,最好取消对跟踪实体的事件处理程序的调用 我将解释我在这个错误中的经历,希望它能帮助别人。谢谢你美丽的解释 我有发票和收据实体和发票视图模型。 ViewModel订阅的发票属性已更改,在该属性中它引发了CanExecuteChanged事件 我将Receipt添加到Invoice navigation属性并调用SaveChanges(),它引发了ViewModel上的Invoice.ReceiptID属性更改并触发了OnPropertyChanged事件处理程序,这反过来引发了各种CanExecuteChanged事件 问题是其中一个CanCommandNameExecute方法调用了Context.ChangeTracker.HasChanges(),最终引发了异常 我是如何修复的? 我遵循jnm2,用IsSaving标记VM,并检查OnPropertyChanged事件处理程序中的标志
再次感谢jnm2,希望有人也会觉得这很有帮助。解除锁定通常是最安全、最轻松的选择。然而,对于我们来说,即使在此期间我们没有设置实体框架可见属性,但收到更改通知也是很有价值的。感谢您发布问题和如此详细的答案!