2010-11-15 64 views
2

((IObjectWithChangeTracker)user).ChangeTracker.State似乎每次都给我“不变”。当我打电话给ApplyChanges时,所有事情都被正确地提取出来了,但是我希望能够在我的业务层面上确定某人是否已经更改了某个特定属性,如果他们确实想要执行操作。自我跟踪pocos,如何判断属性是否已更改?

修订

我相信这是与事实,我并不总是序列化我的实体只有然后触发更改跟踪做。我在一个asp.net场景中使用它们,我不时将它们(串行化)保存到会话状态或视图状态中。

在本页面底部已更新

增加了更多的信息回答。

回答

0

要回答我的问题(我也更新了回答原来的问题)自跟踪波苏斯只是“开始”跟踪自己的变化时,他们反序列化的第一次。例如,最初的意图是针对WCF场景。在我的情况下,我在ASP.NET中经常不使用序列化,这就是为什么更改跟踪从未踢过。在大多数情况下(在我的情况下),我甚至不需要自我跟踪POCO,因为常规POCO会工作得很好。原因是,即使我的实体离开包含获取它们的上下文的存储库的范围,上下文在整个HTTP请求的持续时间内仍处于激活状态。因此,当我对存储库进行后续调用以保持更改时,上下文仍然知道该实体,因为它将其提前(早于相同的HTTP请求)。自我跟踪部分变得有用的情况是,当我想将我的实体保存在ViewState或Session中时,这就是反序列化将触发自我跟踪功能的地方,现在需要将自我跟踪能力作为上下文持久化被委托负责这个实体的更新将不会像获取它的那个一样(不同的HTTP请求一起)。

0

您可以尝试连接属性的OnPropertyChanged事件。

+0

假设这是一个Web服务和实体已被修改的服务,不知道这是一个选择之外。 – e36M3 2010-11-15 21:44:50

+2

这是一个重要的细节。 – 2010-11-15 23:49:06

1

几个选项,每一个跌宕起伏:

  • 你可以继续你的域对象的私人“原始”值。从数据库中获取对象时填充它们,然后可以轻松检查每个字段是否等于其原始值。但是,这可能会让大型物体变得笨重。

  • 另一种选择是让您的域实现ICloneable,并在您的数据访问层中保留原始对象的深层副本以及将其拉起的逻辑。深层拷贝仍然是可变的,所以你必须小心不要修改它,它会增加你的内存占用量。

  • 您可以简单地重新检索记录作为新实例,并检查其字段。这很简单且相对简单,但需要两次到DB。最后,如果你使用的是像NHibernate这样的ORM,你通常可以插入它用来确定哪些数据已经改变的逻辑。这是在您的域图层上执行审计和其他观察行为的最佳位置,但它需要使用支持此功能的ORM,并且您将无法更改数据。

+0

我在这里说的是实体框架ORM。我正在使用自我跟踪pocos,我只是不知道如何利用其变更跟踪功能。很明显,接受他们的上下文理解已经发生了什么变化。 – e36M3 2010-11-16 00:39:41

+0

我不太了解EF,但NHibernate允许您附加事件处理程序和/或“拦截器”(旧样式),当您的某个实体的实例的框架检测到持久变化时,将触发这些事件处理程序和/或“拦截器”我想读一下EF特有的方法来做到这一点; MSDN应该有大量的文档。 – KeithS 2010-11-16 00:49:40

相关问题