如何修复"没有先调用EntityMemberChanging就调用了EntityMemberChanged"

jnm*_*nm2 7 entity-framework

这对我们来说一次又一次.阅读完这样的消息后,没有什么直观的做和调试.

jnm*_*nm2 11

这个记录不清的错误试图说明的是,您不小心设置了一个跟踪更改导致更多更改的系统.

当实体框架更改了您的某个实体上的属性时,例如在具有身份ID更新的SaveChanges期间,您运行的代码更改了其他跟踪属性.

例如,实体框架设置的属性可能触发了一个事件,也许INotifyPropertyChanged是由一个BindingSource或一些绑定列表订阅的,其ListChanged事件处理程序在UI中并触发了一些其他属性的计算,并且更改跟踪器检测到第二次财产变更.

简单的诊断是在SaveChanges调用()之后立即在SaveChanges()调用上放置一个断点.当第一个断点被命中时,在每个可能被触发的事件处理程序上放置一个断点.(BindingSources因为彼此的事件相乘而臭名昭着.)继续调试.如果在SaveChanges之后的点之外的任何断点被击中,您就会知道问题所在.

简单的解决方案IsSaving在SaveChanges调用的每一侧设置一个标志,例如.然后在每个行为不当的事件处理程序中,进行简单检查,如果DbContext正处于保存过程中,则不要修改任何实体.确保你使用finally以防万一SaveChanges抛出你在更高级别捕获的异常:

IsSaving = true;
try
{
    await db.SaveChangesAsync()
}
finally
{
    IsSaving = false;
}
Run Code Online (Sandbox Code Playgroud)

(另一种可能性是您正在从多个线程更改实体 - 从不涉及多个线程中的更改跟踪器!)