实体框架引用完整性问题

本文关键字:问题 完整性 引用 框架 实体 | 更新日期: 2023-09-27 18:18:18

问题:

我有代码,这是添加/更新属性EF。以前它是在修改每个属性之后调用SaveChanges(),在这种情况下它是工作的。我所做的。我修改了代码,使其具有批处理(此时为10项),并在插入一些条目后调用SaveChanges()。但有时它开始抛出这样一个异常

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

问题:

当我试图修改14个条目时发现的问题。第一批10个参赛作品做得不错。当它添加第11个条目时,当试图添加第12个条目时,它抛出了这个异常。我检查了代码,发现了导致异常的部分。

property.CountryId = importProperty.CountryId;

它正在设置CountryId为123,但这里的导航属性Country的Id设置为54(我没有改变这个,只是从数据库得到了版本)。手动将导航属性设置为null会抛出这样的错误

无法更改关系,因为一个或多个外键属性不可为空。进行更改时关系时,相关的外键属性设置为空值。如果外键不支持空值,则建立新的关系必须定义,外键属性必须分配另一个非空值,否则必须删除不相关的对象。

问题:

我该怎么办?为什么当我在每个条目之后调用SaveChanges而在这种情况下不工作时它正在工作?我在Stackoverflow上找到了关于这个问题的问题,但是没有人解决我的问题。

一些代码:

public void InsertOrUpdateEntity(TEntity entity)
{
    if (entity.ObjectState == ObjectState.Added)
    {
           dbSet.Add(entity);
    }
    else
    {
           dbSet.Attach(entity);
           context.ApplyStateChanges();
    }
}

上述属性的dbSet.Attach(entityGraph);行发生错误

实体框架引用完整性问题

这可能就是答案。

将CountryID分配给123,要么为123加载Country实体,要么创建Country实体的新实例并将其ID分配给123,将Country实体附加到实体上下文(即dbset)并将其分配给Country属性

问题是第11行和第12行是数据库中的同一实体

实体框架在第11次记录时将国家Id从101更改为54,然后在第12次记录时更改为123(最后EF以CountryID = 123和国家结束)。如果开始时它们都是101,则Id = 54 !!)。

修复了条件不允许对同一实体进行多次更改的问题

在我的情况下,我已经通过在edmx model的Update向导中检查"包括模型中的外键列"来解决。