我尝试通过使用NHibernate上下文的功能,在子集合中的一个对象被更改时,找出如何识别父对象是否为Dirty。
我的意思是以下情况:
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。
我非常感谢您的解决方案。
答案 0 :(得分:0)
NHibernate不会检查对象图是否脏,而是查看实体本身。所以它忽略了集合和其他引用。
如果您遵循代码
EntityEntry oldEntry = persistenceContext.GetEntry(entity);
Object[] oldState = oldEntry.LoadedState;
oldState仅包含实体的原始值,但包括集合的当前值。所以我的猜测是NHibernate没有考虑到这一点,而是在某个地方进行另一个循环来遍历列表中的那些实体并单独检查它们。
我这样做的方法是循环遍历实体的属性,并通过session.IsDirtyProperty跳过集合和其他实体类型属性来检查,然后循环遍历集合以及集合中的每个实体检查该实体的属性。
请记住,在检查之前,您的会话需要保持打开并且不需要刷新才能使其工作,如果实体与会话分离,则无法使用NHibernate检查它是否脏。
也不建议长时间保持会话开放,你应该使用它并在完成后处理它。