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 核心