实体框架检测到冲突的更改。尝试使用相同的密钥插入多个实体时可能会发生这种情况

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架检测到冲突的更改。尝试使用相同的密钥插入多个实体时可能会发生这种情况相关的知识,希望对你有一定的参考价值。

我有实体User与几个one-to-onemany-to-many关系和Identity primary key,以及generic repository,每个请求创建。

我有一个带有客户端和服务器验证的注册表单,我决定关闭客户端验证以测试服务器在这种情况下的行为方式。

我关闭了客户端验证来测试注册表单并输入一些无效的值,所以我回到表单说我有一些错误,在我修复后我得到了非常有趣的错误说:

_context.SaveChanges(); //towing the error below:

Conflicting changes detected. This may happen when trying to insert multiple entities with the same key

这对我来说很奇怪,因为我分离了实体User,但当我发现这个How to clean-up an Entity Framework object context?所以相反只分离User实体我决定尝试清理对象上下文完全运行该代码:

var objectStateEntries = this.objectContext
                             .ObjectStateManager
                             .GetObjectStateEntries(EntityState.Added);

    foreach (var objectStateEntry in objectStateEntries)
    {
        if(objectStateEntry.Entity != null)
           this.objectContext.Detach(objectStateEntry.Entity);
    }

因此,所有工作良好,我没有得到Conflicting changes detected错误,但我仍然想知道为什么会发生这种情况,可能有人可能会解释?

答案

你可以找到你的答案here

context.ObjectStateManager.GetObjectStateEntries(System.Data.Entity.EntityState.Added| System.Data.Entity.EntityState.Unchanged);

以上是关于实体框架检测到冲突的更改。尝试使用相同的密钥插入多个实体时可能会发生这种情况的主要内容,如果未能解决你的问题,请参考以下文章

C#实体框架:添加/插入记录并选择他而不保存更改[重复]

使用实体框架6插入已断开的相关实体

具有存储库模式的实体框架,将数据插入到具有多对多关系的表中

如何阻止实体框架尝试保存/插入子对象?

实体框架两次插入相同的实体[重复]

使用实体框架手动输入密钥