实体框架参照完整性问题

时间:2014-08-15 06:34:13

标签: c# .net asp.net-mvc entity-framework entity-framework-5

问题:

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

  

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

我发现的问题:

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

property.CountryId = importProperty.CountryId;

将CountryId设置为123,但此处的导航属性Country将Id设置为54(我没有更改此内容,只是从数据库获取版本)。手动将导航属性设置为null会引发这样的错误

  

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

问题:

我该怎么办?当我在每次输入后调用SaveChanges并且在这种情况下不工作时,为什么它正在工作?我在Stackoverflow中发现了有关此问题的问题,但没有人解决我的问题。

部分代码:

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

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

3 个答案:

答案 0 :(得分:0)

这可能就是答案。

将CountryID分配给123,加载国家/地区实体123或创建国家/地区实体的新实例并将其ID分配给123,将国家/地区实体附加到实体上下文(即dbset)并分配它到乡村财产。

答案 1 :(得分:0)

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

实体框架在第11条记录中将国家标识从101更改为54,而在第12条记录中更改为123(最后EF结束时,国家ID = 123,Country.Id = 54,如果在开始时它们都是101 !!)。

问题已通过条件修复,不允许对同一实体进行多次更改。

答案 2 :(得分:0)

就我而言,我已通过在edmx模型的更新向导中选中“在模型中包括外键列”来解决。