c# - 使用子集合更新 NHibernate 对象
问题描述
我正在尝试使用在休眠会话中找到的 .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 是一个临时对象(在早期会话中从数据库中获得,并显示在 UI 中),它包含与我要更新的对象相同的标识符,但对子集合进行了更改。不知何故,使用这种方法我只能添加孩子,但不能修改或删除它们。
我的错误在哪里?
解决方案
最有可能发生在您身上的是,您没有修改 NHibernate 在您的 Parent 实体中实例化的集合,而是将其全部替换为HashSet
.
当您从 NHibernate 保存或获取实体时,您的 ChildrenISet
会加载一个PersistentGenericSet
(实现ISet
) 的实例,该实例负责帮助跟踪您的集合的更改。
简而言之,不要分配给 Children 属性。实际上,制作 setter protected
。只是Add()
或Remove()
或Clear()
它根据需要。
推荐阅读
- ruby-on-rails - 如何在 Rails 中创建嵌套对象表单?
- image - 如何将图像像素转换为 txt 文件中的 HEX 颜色代码?
- php - 为什么我的 SESSION 变量在主机上未定义但在本地未定义
- r - R:如何提高梯度提升模型的拟合度
- r - 如何为 R 中的每个股票价格创建索引值?
- c# - DataTemplate 中的 WPF 绑定用户控件
- c++ - 从文件中提取的字符串未正确计算
- c++ - 如何在 C++ 中优化数组的交换元素
- load-balancing - 负载均衡器如何处理所有服务器都忙的情况?
- javascript - 无论地图视图/缩放如何,如何使用 Google Maps API 一次只能看到 10 个标记