Entity framework 实体框架4:保存父对象时如何获取子对象的原始值?

Entity framework 实体框架4:保存父对象时如何获取子对象的原始值?,entity-framework,audit,change-tracking,Entity Framework,Audit,Change Tracking,我在SE上看到过很多与此相关的帖子,但没有一篇能令人满意地回答这个问题。如果有一篇文章确实回答了这个问题(有一个实际的代码示例),那么请告诉我这个方向 保存对象时,我需要将信息写入日志。我需要知道原始值和新值。这对于父对象来说非常容易,甚至在任何更改的子对象上获取新值也相当容易。挑战在于获取子对象的原始值 例如,用户通过下拉列表更改子对象。这将更改父对象上外键的值。保存时,我需要在日志中写入已更改实体的文本描述(ToString()值或其他一些值),而不是外键的值 ObjectStateEntr

我在SE上看到过很多与此相关的帖子,但没有一篇能令人满意地回答这个问题。如果有一篇文章确实回答了这个问题(有一个实际的代码示例),那么请告诉我这个方向

保存对象时,我需要将信息写入日志。我需要知道原始值和新值。这对于父对象来说非常容易,甚至在任何更改的子对象上获取新值也相当容易。挑战在于获取子对象的原始值

例如,用户通过下拉列表更改子对象。这将更改父对象上外键的值。保存时,我需要在日志中写入已更改实体的文本描述(ToString()值或其他一些值),而不是外键的值

ObjectStateEntry包含父对象的当前值和原始值,但如何获取已更改子对象的当前值和原始值

看起来这应该是可能的,但要么太难实现,要么被微软设计团队忽略了


提前感谢您的帮助。

与您通常获得帮助的方式相同:您可以查找帮助。请记住,在您的情况下,“子对象”甚至可能不会从数据库中加载。在更改“父项”上的FK值之前,不需要执行此操作

听起来你并不是真的改变了“子对象”本身。相反,您只是将“父对象”更改为指向不同的子对象


在本例中,我将使用Context.GetObjectByKey()根据原始FK值提取对象。如果它恰好被加载,它会从内存中获取,如果没有加载,它会从数据库中获取。

为什么不能使用
var entity=context.Entry(您的子实体实例)获取更改然后使用
实体。原始值
?如果我想对每个对象的名称进行硬编码,我可以这样做,但我希望有一个更通用的方法可以检查对象,获取任何已更改的旧值和新值,如果其中一个值恰好是外键,获取关系中对象的新旧值。谢谢。在我的例子中,加载了子对象,它根据对外键的更改显示了新的值,但我明白你的意思。我认为我可能必须从db中重新加载子实体才能获得原始值,但这似乎非常昂贵。我将尝试我不熟悉的GetObjectByKey()方法。