代码之家  ›  专栏  ›  技术社区  ›  e36M3

自动跟踪POCO,如何判断属性是否已更改?

  •  2
  • e36M3  · 技术社区  · 14 年前

    ((IObjectWithChangeTracker)user).ChangeTracker.State 似乎每次都给我“不变”。当我调用ApplyChanges时,所有内容都被正确地提取,但是我希望能够在我的业务层中确定某人是否更改了某个特定的属性,如果他们更改了,我想执行一个操作。

    更新

    我相信这与我并不总是序列化实体这一事实有关,它只会触发更改跟踪。我在一个asp.net场景中使用它们,在这个场景中,我会不时地将它们持久化(序列化)到会话状态或viewstate中。

    更新

    在本页底部的答案中添加了更多信息。

    3 回复  |  直到 14 年前
        1
  •  1
  •   KeithS    14 年前

    有几个选项,每个选项都有起伏:

    • 您可以在域对象上保留一个私有的“原始”值。从数据库中获取对象时填充它们,然后可以轻松检查每个字段是否等于其原始值。不过,这在大型物体上可能会变得很麻烦。

    • 另一个选择是让你的域实现ICloneable,并在你的数据访问层中保留一个原始对象的深层副本,以及将其向上拉的逻辑。深层副本仍然是可变的,因此您必须注意不要修改它,它会使您的内存占用增加一倍。

    • 您可以简单地将记录作为新实例重新检索,并检查其字段。这很简单,也相对简单,但需要两次访问数据库。

    • 最后,如果您使用的是像NHibernate这样的ORM,通常可以插入它用来确定哪些数据发生了更改的逻辑。这是在您的域层上执行审计和其他观察行为的最佳位置,但它需要使用支持此操作的ORM,并且您更改数据的能力有限。

        2
  •  0
  •   Robert Harvey    14 年前

    你可以试着把 OnPropertyChanged 属性的事件。

        3
  •  0
  •   e36M3    14 年前

    为了回答我自己的问题(我也用答案更新了原始问题),自跟踪poco只在第一次反序列化时“开始”跟踪自己的更改。例如,最初的目的是为了WCF场景。在我的情况下,我经常在ASP.NET中使用,而根本不使用序列化,这就是为什么更改跟踪从未启动的原因。在大多数情况下(在我的例子中),我甚至不需要自跟踪的poco,因为普通的poco工作得很好。原因在于,即使我的实体离开了包含获取它们的上下文的存储库的范围,但在整个HTTP请求期间,上下文仍然处于活跃状态。因此,当我对存储库执行后续调用以持久化所做的更改时,上下文仍然知道该实体,因为它是从该实体开始获取的(在同一个HTTP请求的前面)。自我跟踪部分变得有用的情况是,当我想在ViewState或Session中持久化我的实体时,这就是反序列化将触发自跟踪功能的地方,现在需要该功能来持久化更改,因为负责更新此实体的上下文将与获取该实体的上下文不同(所有不同的HTTP请求都在一起)。