发生了引用完整性约束违规

我正在尝试更新现有实体。

我有以下代码:

public MamConfiguration_V1 Save(MamConfiguration_V1 item) { mMaMDBEntities.MamConfiguration_V1.Attach(item); mMaMDBEntities.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified); mMaMDBEntities.SaveChanges(); return item; } 

Attach方法抛出exception:

发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致。

我怎样才能解决这个问题?

item对象的定义是什么? 似乎在其某些集合中设置与其他实体的关系存在某种类型的冲突。 您可以尝试清除所有集合以查看问题是否仍然存在,但在这种情况下您丢失了外键分配。 但也许它可以帮助您找到问题所在。

这可能是一个提示。 当我尝试将现有实体附加到上下文时,我会使用以下操作:

 mMaMDBEntities.Entry(item).State = System.Data.EntityState.Modified; 

您可以添加System.Data的使用,以避免一直写入它。

这会将实体附加到您想要的状态,在这种情况下进行修改并跟踪更改。 这是一行而不是两行。

看起来您与项目中的外键字段和导航属性有某种关系,并且这些字段具有冲突的值。 当您加载实体及其相关实体,在一端更改关系,仅将该末端标记为已Modified并尝试保存时,会发生这种情况。 确保在调用SaveChanges之前修改两端的关系并将所有受影响的实体标记为已Modified

我在不同情况下遇到此exception,并且在此处发布,因为在搜索错误消息时出现此问题。

使用部分加载的实体调用IObjectContextAdapter.ObjectContext.AttachTo(entitySetName, entity)时抛出exception。 定义了实体上的外键,但未加载导航属性。 (也就是说, O.ItemID有一个值,但O.Item为null)。 具体情况不允许加载O.Item

问题原来是对象状态管理器已经在一个单独的方法中加载了对象,并且已经跟踪了使用相同键定义的对象。 由于单独的方法不需要跟踪对象状态,因此通过在该方法中调用IQueryable.AsNoTracking()解决该问题。

对我来说问题是entity framework已经将对象加载到多个位置,所以当我更新外键时,现在有两个对同一对象的引用,一个用外键指向记录a,一个用外键指向记录b,因为我的关系是一对一的,所以导致错误。 为了解决它,我使用了context.Entry(Object).State = EntityState.Detached,重新加载了对象,使外键发生了变化,然后保存了我的更改