【发布时间】:2011-08-09 21:05:44
【问题描述】:
我目前正在使用带有 Ef 4.1 的 DbContext,并且我正在尝试审核我的一些实体的所有更改。我可以捕获实体的任何属性的原始值和当前值,但是我无法弄清楚如何捕获 NavigationProperty 的关联(外键)OriginalValues。有人知道吗?
【问题讨论】:
标签: c# entity-framework entity-framework-4 entity-framework-4.1
我目前正在使用带有 Ef 4.1 的 DbContext,并且我正在尝试审核我的一些实体的所有更改。我可以捕获实体的任何属性的原始值和当前值,但是我无法弄清楚如何捕获 NavigationProperty 的关联(外键)OriginalValues。有人知道吗?
【问题讨论】:
标签: c# entity-framework entity-framework-4 entity-framework-4.1
您必须在实体中包含外键,以便将它们作为正常值进行跟踪,或者您必须将DbContext 转换为ObjectContext 并使用更强大(也更麻烦)的ObjectStateManager,您可以在其中获取实例ObjectStateEntry 用于实体和关系。
要将DbContext 转换为ObjectContext,请使用:
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
要获取条目,请使用:
var entires = objectContext.ObjectStateManager
.GetObjectStateEntries(~EntityState.Unchanged);
遍历条目并使用它们的State、CurrentValues 和OriginalValues 属性进行日志记录。不应修改关系,因此您只需要检查已删除和添加的关系(而不是更新旧的删除并添加新的)。问题在于删除一次,因为它们不会为您提供它们的值。您可以通过更改它们的状态、获取值并将状态更改回已删除来尝试小的解决方法 - 如果它不起作用,您将无法记录关系的旧值。
【讨论】: