3

当使用 NHibernate 上下文的特性更改子集合中的对象之一时,我试图找出如何识别父对象是脏的。

我的意思是以下情况:

public class Parent
{
   public IList<Child> Childs { get; set; }
}

public class Child
{
   public String Name {get; set; }
}

...

var parent = session.Get<Parent>(1);
parent.Childs[0].Name = "new name";
// here <code>session.IsEntityDirty(parent)</code> should return true

我知道 ISession 的扩展,比如这里http://nhibernate.info/doc/howto/various/finding-dirty-properties-in-nhibernate.html和这里收集NHibernate: Find dirty collections。但是第一个(它只跟踪属性)和第二个(它只跟踪对集合对象的添加/删除操作)都不起作用。

我还想提一下,我更喜欢使用普通的 POCO 而不是 STE。

我将非常感谢您的解决方案。

4

1 回答 1

0

它不会查看 NHibernate 是否正在检查对象图是否脏,而是检查实体本身。所以它忽略了集合和其他引用。

如果你按照代码

EntityEntry oldEntry = persistenceContext.GetEntry(entity);
Object[] oldState = oldEntry.LoadedState;

oldState 仅包含实体的原始值,但包含集合的当前值。所以我的猜测是 NHibernate 没有考虑到这一点,而是在某处进行另一个循环以遍历列表中的这些实体并分别检查它们。

我这样做的方法是遍历实体的属性并使用 session.IsDirtyProperty 跳过集合和其他实体类型属性进行检查,然后遍历集合并针对集合中的每个实体检查该实体的属性。

请记住,在检查之前,您的会话需要保持打开状态而不是刷新才能正常工作,如果实体与会话分离,则无法使用 NHibernate 来检查它是否脏。

也不建议长时间保持会话打开,您应该使用它并在完成后处理它。

于 2013-08-22T09:36:21.437 回答