发生了参照完整性约束违规

Ela*_*nda 7 c# asp.net-mvc entity-framework-4

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

我有以下代码:

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

但是这些Attach方法抛出异常:

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

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

Mat*_*t J 8

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

  • 在正常情况下,EF会自动跟踪更改,您只需调用"SaveChanges"而无需手动设置标志.在断开连接的场景中,没有简单的方法,但您必须手动将其标记为已修改. (2认同)

drf*_*drf 5

我在不同的情况下遇到了这个异常,我在这里发帖是因为在搜索错误消息时出现了这个问题。

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

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


Álv*_*cía 4

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

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

mMaMDBEntities.Entry<MamConfiguration>(item).State = System.Data.EntityState.Modified;
Run Code Online (Sandbox Code Playgroud)

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

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