【发布时间】:2014-08-15 06:34:13
【问题描述】:
问题:
我有使用 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); 行发生错误。
【问题讨论】:
-
我认为关键部分是导航属性和外键。以及导致问题的查询和分配序列。你是说它们的价值不同吗?如果是,为什么? 123是一个国家的有效身份证吗?什么设置国家导航属性和什么设置外键?也许这些可能会有所帮助...ladislavmrnka.com/2011/05/… ...或...stackoverflow.com/questions/14915938/…
-
是的,它们不同,因为之前 CountryId 为 54,但代码尝试将其修改为新值 - 123。
-
我猜 CountryID 是不可为空的。我想也许 123 是实体框架在设置值之前设置的虚拟值。导航属性 Country 是否也是同一批次中保存的新实体?
-
CountryID 不可为空。它只是从数据库中获取属性,设置 Property.CountryId(和其他字段)并调用 Attach。
-
如果您可以发布一小段代码来复制显示对实体的分配和对 savechanges 的调用的问题,我认为这将有助于人们理解问题
标签: c# .net asp.net-mvc entity-framework entity-framework-5