【问题标题】:Entity Framework referential integrity issue实体框架参照完整性问题
【发布时间】: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


【解决方案1】:

这可能就是答案。

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

【讨论】:

    【解决方案2】:

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

    实体框架在第 11 条记录中将 Country Id 从 101 更改为 54,在第 12 条记录中更改为 123(最后 EF 以 CountryID = 123 和 Country.Id = 54 结束,以防一开始它们都是 101 !!)。

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

    【讨论】:

      【解决方案3】:

      在我的情况下,我通过在 edmx 模型的更新向导中选中“在模型中包含外键列”来解决。

      【讨论】:

      • 这也可以是评论,因为您没有指出任何特定的解决方案。
      猜你喜欢
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多