【发布时间】: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 没有为该表创建类(这是数据库第一个项目)
如果有什么不清楚的地方请告诉我。
【问题讨论】:
-
我确实有由上下文跟踪的实体,其日期时间字段设置为 Nothing... 但我能够在许多其他情况下毫无问题地保存这些实体。我应该设置一个在每个领域都没有任何意义的日期吗? :/ 在与错误消息相关的 3 个表中(Produit、Depot 和 Produit-Depot),一个表(Produit)有一个 datetime 字段并且它总是有一个值
-
您不会在
ChangeTracker.Entries中看到隐式联结表条目(DbContextAPI 未公开一种特殊的关系条目类型)。 -
啊,谢谢。很高兴知道这一点。
-
当您有解决方案时,通常会回答您自己的问题并接受它(可能会在一段时间后允许)。这样其他人就会知道问题已得到解答。
标签: vb.net entity-framework primary-key dbcontext savechanges