编辑:知道了!感谢您对人们的帮助:)我在最后发布了"解决方案">,虽然我不知道它是否会帮助任何人,这主要是由于我的设计不好。
我在尝试.SaveChanges()
时收到 DbUpdateException
保存未公开其关系的外键属性的实体时出错。属性将返回 null,因为无法将单个实体标识为异常的来源。通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常。有关详细信息,请参阅 InnerException。
InnerException
是:
违反主键约束 « PK_ProduitDepot_1 » ...无法在对象产品库中插入重复的密钥。
以下是我用来查看应保存哪些实体的一些代码:
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 尚未为该表创建类(这是数据库第一个项目(
如果有什么不清楚的地方,请告诉我。
解决方案
有趣的部分:
正如 Ivan Stoev 指出的那样,由于错误消息是关于一个联结表(它没有与之关联的类,因为 EF 在生成我的模型时没有创建任何类(,因此这些完整的表未在ChangeTracker.Entries
中列出。这就是为什么我相信所有实体都处于不变状态。
可能无用的部分:
我用一个添加包含解决了我的问题,使用 Context.Person.Include("Cars.Wheels")
(编造名称,但你明白了(。我以前只有Context.MyEntity.Include("Cars")
,以后使用 FK 以某种方式手动分配我的汽车Wheels
导航属性。这就是问题的来源。