使用 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 对象。个人解决方案

使用 JPA 获取最后插入记录的主键

开发技巧-如何获取表记录的主键

为什么不能直接调用DbContext.ObjectContext 获取属性呢?

mybatis如何获取oracle新插入数据记录的主键?

编译的查询错误:没有从实体到'System.Data.Objects.ObjectContext的隐式转换