【问题标题】:Entity Framework 4.1 and OriginalValues/CurrentValues and DbContextEntity Framework 4.1 和 OriginalValues/CurrentValues 和 DbContext
【发布时间】:2011-08-09 21:05:44
【问题描述】:

我目前正在使用带有 Ef 4.1 的 DbContext,并且我正在尝试审核我的一些实体的所有更改。我可以捕获实体的任何属性的原始值和当前值,但是我无法弄清楚如何捕获 NavigationProperty 的关联(外键)OriginalValues。有人知道吗?

【问题讨论】:

    标签: c# entity-framework entity-framework-4 entity-framework-4.1


    【解决方案1】:

    您必须在实体中包含外键,以便将它们作为正常值进行跟踪,或者您必须将DbContext 转换为ObjectContext 并使用更强大(也更麻烦)的ObjectStateManager,您可以在其中获取实例ObjectStateEntry 用于实体和关系。

    要将DbContext 转换为ObjectContext,请使用:

    var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
    

    要获取条目,请使用:

    var entires = objectContext.ObjectStateManager
                               .GetObjectStateEntries(~EntityState.Unchanged);
    

    遍历条目并使用它们的StateCurrentValuesOriginalValues 属性进行日志记录。不应修改关系,因此您只需要检查已删除和添加的关系(而不是更新旧的删除并添加新的)。问题在于删除一次,因为它们不会为您提供它们的值。您可以通过更改它们的状态、获取值并将状态更改回已删除来尝试小的解决方法 - 如果它不起作用,您将无法记录关系的旧值。

    【讨论】:

    • 在我的初始查询中,我已经包含了这些 fk/相关实体,您是说我应该能够在执行此操作时捕获更改的值和原始值吗?
    • 另外,我不确定我是否澄清了这个问题,基本上我有 4 列用于静态表。例如,在我要审核更改的表上,假设我有一个名为 transactionid 的列。当我改变交易时,我希望通过 currentvalues 和 originalvalues 访问它。但是,由于 transactionid 实际上是 fk 到另一个表,所以我的模型上没有属性,只是一个导航属性。但是,我想要捕获的只是对象更改前后 transactionid 的整数。
    • 他们应该存在一对多和一对一的关系。
    • 刚找到这个,也许我需要这些“FK 关联”,所以我的 FK/NavigationProperties 上的 ID 是我实体中的属性。 blogs.msdn.com/b/efdesign/archive/2009/03/16/…
    • FK 关联是我所提到的。 stackoverflow.com/questions/5281974/…
    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多