gpt4 book ai didi

c# - 使用子集合更新 NHibernate 对象

转载 作者:行者123 更新时间:2023-11-30 22:58:42 25 4
gpt4 key购买 nike

我正在尝试使用在休眠 session 中找到的 .Update() 方法使用子集合更新 nHibernate 对象。对于当前设置,我唯一能做的就是添加子项,我无法修改或删除它们。

为清楚起见,对象及其映射如下:

public class Parent {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ISet<Child> Children { get; set; } = new HashSet<Child>();
}

public class ParentMap: ClassMap<Parent>
{
public ParentMap()
{
Id(x => x.Id);
Map(x => x.Name);
HasMany(x => x.Children)
.AsSet()
.Inverse()
.Cascade.AllDeleteOrphan();
}
}

public class Child {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Parent Parent { get; set; }
}

public class ChildMap: ClassMap<Child>
{
public ChildMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.Parent);
}
}

当我从我的 UI 层获得更改并尝试使用以下方法更新已经存在的对象时:

using (var tx = _session.BeginTransaction())
_session.Update(newParent);
tx.Commit();
}

这里的 newParent 是一个临时对象(在早期 session 中从数据库中获取并显示在 UI 中)包含与我要更新的对象相同的标识符,但对子集合进行了更改。不知何故使用这种方法我只能添加 child ,但不能修改或删除它们。

我的错误在哪里?

最佳答案

最有可能发生在您身上的是,您没有修改 NHibernate 在您的父实体中实例化的集合,而是将其全部替换为 HashSet 的新实例。

当您从 NHibernate 保存或获取实体时,您的子级 ISet 会加载 PersistentGenericSet 的实例(实现 ISet)它负责帮助跟踪您的收藏的变化。

总之,不要给Children属性赋值。事实上,使 setter protected。只需 Add()Remove()Clear() 即可。

关于c# - 使用子集合更新 NHibernate 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52858797/

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