问题:
我有使用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);
行上发生了上述属性的错误。
答案 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模型的更新向导中选中“在模型中包括外键列”来解决。