使用 ObjectContext 获取关系记录的主键
Posted
技术标签:
【中文标题】使用 ObjectContext 获取关系记录的主键【英文标题】:Get primary key of relationship record with ObjectContext 【发布时间】:2016-03-21 13:08:56 【问题描述】:我尝试使用 EF 的 ChangeTracker
进行审核并保存数据库中的所有更改(添加 + 更新)。
所以使用ChangeTracker
我将能够获取所有更改的表,以及每个表的所有值。但是我还需要新表中新记录的ID。
其中一些是关系,当我尝试用EntityKey
获取值时,主键是0
private object GetPrimaryKeyValue(DbEntityEntry entry)
var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
return objectStateEntry.EntityKey.EntityKeyValues[0].Value;
有人知道,如果我走错路了,是否有可能获得相关实体的主键?
谢谢!
【问题讨论】:
我认为您需要检查您的数据库表。如果是主键,则不能为空(见***.com/questions/3876785/…)。 其实我说错了,不是null而是0。主键是表中自增字段。 【参考方案1】:我认为您会得到 0(即默认值(int)),因为自动增量(身份)列仅在保存完成后才会填充(即 dbContext.SaveChanges
已成功完成)。尝试读取SaveChanges()
之后的值,就像建议的here 一样。
这看起来像是一种捕获新添加值的方法,您必须重写 SaveChanges 并自己获取生成的值,就像提到的 here。
【讨论】:
是的,但我想做的是将所有新添加的值保存到另一个表中,因为我使用 EF 的 ChangeTracker 检索所有这些值。当涉及到现有数据的更新时,这不是问题,但在这种情况下,它是针对新行的,主键是 0 我在回答中添加了额外的参考。 请注意:由于我不喜欢触发器,我更喜欢 .NET 解决方案。但是,请记住,如果表数据可以由其他应用程序而不是您自己的应用程序更改,则触发器可能更合适。 好的,Alexei,您的建议和参考对我没有帮助,因为我得到了相同的结果,主键为 0。如果我在调用SaveChanges()
后进行审核,我会丢失EntityState
值(在这种情况下添加)但如果检查状态Unchanged
我新添加的对象包含所有值,因此带有 ID。您认为在为新添加的对象调用SaveChanges()
后使用未更改的状态是否正确?以上是关于使用 ObjectContext 获取关系记录的主键的主要内容,如果未能解决你的问题,请参考以下文章
关于:无法定义这两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。个人解决方案