自我跟踪pocos,如何判断房产是否已经改变?

时间:2010-11-15 21:26:21

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

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

已更新

我认为这与我不总是序列化我的实体这一事实有关,而实体只会触发更改跟踪。我在asp.net场景中使用它们,我会不时地将它们(序列化)保存到会话状态或视图状态。

已更新

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

3 个答案:

答案 0 :(得分:1)

有几种选择,每种都有起伏:

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

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

  • 您可以简单地将记录重新检索为新实例,并检查其字段。这很简单,相对简单,但需要两次前往DB。

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

答案 1 :(得分:0)

您可以尝试为该属性挂钩OnPropertyChanged事件。

答案 2 :(得分:0)

回答我自己的问题(我还用答案更新了原始问题)自我跟踪POCO仅在第一次反序列化时“开始”跟踪他们自己的更改。例如,最初的意图是针对WCF场景。在我的情况下,我经常在不使用序列化的情况下使用ASP.NET,这就是为什么更改跟踪从未启动过。在大多数情况下(在我的情况下)我甚至不需要自我跟踪POCO,因为常规POCO会工作得很好。原因是,即使我的实体离开了包含获取它们的上下文的存储库的范围,上下文仍然在整个HTTP请求的持续时间内仍然存在。因此,当我对存储库进行后续调用以持续进行更改时,上下文仍然知道该实体,因为它从一开始就获取它(在同一HTTP请求中较早)。自我跟踪部分变得有用的情况是,当我想在ViewState或Session中保持我的实体时,反序列化将触发自我跟踪功能,现在需要将更改作为上下文保留。负责更新此实体的任务与获取它的实体不同(不同的HTTP请求全部在一起)。