gpt4 book ai didi

c# - NHibernate:在子集合中查找脏对象

转载 作者:行者123 更新时间:2023-11-30 18:32:46 27 4
gpt4 key购买 nike

我试图找出当子集合中的一个对象通过使用 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。

如果有解决方案,我将不胜感激。

最佳答案

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

如果你按照代码

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

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

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

请记住,您的 session 需要保持打开状态而不是刷新才能在检查之前工作,如果实体从 session 中分离,将无法使用 NHibernate 检查它是否脏。

也不建议长时间保持 session 打开,您应该使用它并在完成后将其丢弃。

关于c# - NHibernate:在子集合中查找脏对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18357856/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com