Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework “如何修复”;调用EntityMemberChanged时未首先调用EntityMemberChanged“EntityMemberChanged”;_Entity Framework - Fatal编程技术网

Entity framework “如何修复”;调用EntityMemberChanged时未首先调用EntityMemberChanged“EntityMemberChanged”;

Entity framework “如何修复”;调用EntityMemberChanged时未首先调用EntityMemberChanged“EntityMemberChanged”;,entity-framework,Entity Framework,我们一次又一次地想到这件事。在阅读了这样一条消息之后,没有什么直观的操作和调试方法。这个记录不良的错误试图说明的是,您意外地设置了一个系统,其中跟踪更改会导致更多更改 当Entity Framework更改某个实体上的属性时,例如在使用标识ID更新保存更改期间,您运行了更改其他跟踪属性的代码 例如,实体框架正在设置的属性触发了一个事件,可能是INotifyPropertyChanged,该事件可能是由BindingSource或某个绑定列表订阅的,其ListChanged事件处理程序位于UI中,

我们一次又一次地想到这件事。在阅读了这样一条消息之后,没有什么直观的操作和调试方法。

这个记录不良的错误试图说明的是,您意外地设置了一个系统,其中跟踪更改会导致更多更改

当Entity Framework更改某个实体上的属性时,例如在使用标识ID更新保存更改期间,您运行了更改其他跟踪属性的代码

例如,实体框架正在设置的属性触发了一个事件,可能是
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,希望有人也会觉得这很有帮助。

解除锁定通常是最安全、最轻松的选择。然而,对于我们来说,即使在此期间我们没有设置实体框架可见属性,但收到更改通知也是很有价值的。感谢您发布问题和如此详细的答案!