EF 尝试插入未更改的实体

Posted

技术标签:

【中文标题】EF 尝试插入未更改的实体【英文标题】:EF trying to insert Unchanged entities 【发布时间】:2018-04-30 13:29:58 【问题描述】:

编辑:知道了!感谢您的帮助:)我在最后发布了“解决方案”,虽然我不知道它是否会帮助任何人,这主要是由于我的糟糕设计..


我在尝试 .SaveChanges() 时遇到了 DbUpdateException

保存不为其关系公开外键属性的实体时发生错误。 EntityEntries 属性将返回 null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常。有关详细信息,请参阅 InnerException。

InnerException 是:

违反 PRIMARY KEY 约束 « PK_ProduitDepot_1 » ... 无法在对象 Produit-Depot 中插入重复键 ..

这是我用来查看应该保存哪些实体的一些代码:

 Dim allEntries = MyContext.ChangeTracker.Entries
    Dim unchangedEntities As New Dictionary(Of Object, EntityState)

    For Each entry As DbEntityEntry In allEntries
        Dim NotUnchangedEntity = entry.Entity
        If MyContext.Entry(NotUnchangedEntity).State <> EntityState.Unchanged Then
            unchangedEntities.Add(entry.Entity, MyContext.Entry(entry.Entity).State)
        End If
    Next

    MyContext.Database.Log = AddressOf Console.WriteLine
    context.SaveChanges()

我在调试模式下看到未更改实体为空。

我对 EF 有什么遗漏吗?如果我的上下文缓存中只有未更改的实体,我不明白为什么会执行任何 SQL...

Produit-Depot 表是具有 * 到 * 关系的联结表,因此 EF 没有为该表创建类(这是数据库第一个项目)

如果有什么不清楚的地方请告诉我。

【问题讨论】:

你试过了吗? - ***.com/questions/7938384/… 我确实有由上下文跟踪的实体,其日期时间字段设置为 Nothing... 但我能够在许多其他情况下毫无问题地保存这些实体。我应该设置一个在每个领域都没有任何意义的日期吗? :/ 在与错误消息相关的 3 个表中(Produit、Depot 和 Produit-Depot),一个表(Produit)有一个 datetime 字段并且它总是有一个值 您不会在ChangeTracker.Entries 中看到隐式联结表条目(DbContext API 未公开一种特殊的关系条目类型)。 啊,谢谢。很高兴知道这一点。 当您有解决方案时,通常会回答您自己的问题并接受它(可能会在一段时间后允许)。这样其他人就会知道问题已得到解答。 【参考方案1】:

解决方案

有趣的部分:

正如 Ivan Stoev 指出的那样,由于错误消息是关于一个联结表(它没有与之关联的类,因为 EF 在生成我的模型时没有创建任何类),所以这些实体没有在 @ 987654321@。这就是为什么我相信所有实体都处于未更改状态。

可能没有帮助的部分:

我使用Context.Person.Include("Cars.Wheels")(组成名称,但你明白了)通过添加包含解决了我的问题。我曾经只有Context.MyEntity.Include("Cars"),后来以某种方式手动分配了我的汽车的Wheels 导航属性,使用FK ..这就是问题的来源。

【讨论】:

以上是关于EF 尝试插入未更改的实体的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止实体框架尝试保存/插入子对象?

尝试 开始事务,保存更改 捕获 回滚,开始另一个事务,保存更改 EF 核心

如何在 EF 中获取实体更改增量?

实体框架核心 DbContextFactory 未注册

如何在 .SaveChanges() 期间首先使用 EF 代码记录所有实体更改?

EF Core 错误 - 未找到项目。更改当前工作目录或使用 --project 选项