实体框架参考完整性问题

问题描述 投票:0回答:3

的问题。

我的代码是用EF添加更新属性。以前它是在修改每个属性后调用SaveChanges(),在这种情况下,它是工作的。我已经修改了代码,有一个批次(10项,在这个时候),并插入条目数后调用SaveChanges()。但有时它开始抛出这样一个异常

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

我发现的问题。

当我试图修改14个条目时,我发现了这个问题。第一批10个条目它做得很好。我检查了代码,发现导致异常的部分。

property.CountryId = importProperty.CountryId;

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

由于一个或多个外键属性不可空值,所以不能更改关系。当对关系进行更改时,相关的外键属性被设置为空值。 如果外键不支持空值,则必须定义一个新的关系,必须给外键属性分配另一个非空值,或者必须删除不相关的对象。

问题:我应该怎么做?

我应该怎么做?为什么我在每个条目后调用SaveChanges时都能正常工作,而在这种情况下却不能工作?我在Stackoverflow中找到了关于这个问题的问题,但是没有人解决我的问题。

一些代码。

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

错误发生在这一行 dbSet.Attach(entityGraph); 与上面提到的属性。

c# .net asp.net-mvc entity-framework entity-framework-5
3个回答
0
投票

这可能是答案。

将CountryID分配给123,或者加载123的Country实体,或者创建一个新的Country实体实例并将其ID分配给123,将国家实体附加到实体上下文(即dbset)并将其分配给Country属性。


0
投票

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

实体框架将第11条记录的国家ID从101改为54,然后在第12条记录中改为123(最后EF完成了CountryID=123和Country.Id=54,而在开始的时候它们都是101!)。

这个问题通过不允许同一实体多次更改的条件得到了解决。


0
投票

在我的例子中,我通过在edmx Model的更新向导中勾选 "Include foreign key columns in the model "来解决。

© www.soinside.com 2019 - 2024. All rights reserved.