我有 x,它是 objectX 类型的对象,它有一个属性 ListOfObjectYs 那是一个
List<objectY>
nhibernate 映射如下所示:
public ObjectXMap()
{
HasMany(x => x.ListOfObjectYs).AsBag().Inverse();
}
当我去保存它时,我更改了 objectX 的一些属性,然后:
Session.SaveOrUpdate(x);
现在我需要更新这个列表属性。我得到一个新的 objectY 列表,我想用一个新列表替换现有的 objectY 列表。我需要这样做吗?
foreach (ObjectY y in x.ListOfObjectYs)
{
Session.Delete(y);
deleted = true;
}
if (deleted)
{
_session.Flush();
}
x.ListOfObjectYs.Clear();
foreach (ObjectY y in newObjectYList)
{
x.ListOfObjectYs.Add(y);
Session.SaveOrUpdate(y);
}
_session.Flush();
我的问题是:
- 我是否必须删除所有内容并在添加新内容之前刷新。
- 我是否需要在两者之间进行所有这些增量保存
有没有更好的方法来执行此更新,我需要更新一个对象(属性),但也更新列表中的属性,其中有一个全新的列表(意味着需要删除和添加项目)。
最佳答案
您的问题的答案是否定的。如果您想替换列表,您应该清除它并添加新项目。如果您将 cascade 设置为 all-delete-orphan,如 James Kovacs 的回答,那么在刷新 session 时将保留对集合的更改。
了解 Save、Update 和 SaveOrUpdate 在 NHibernate 中的含义很重要:
- 保存 - 使新对象持久化
- 更新 - 使已更改的分离对象持久化
- SaveOrUpdate - 根据对象标识符的未保存值保存或更新
另见 Manipulating Persistent Data .
假设您的所有对象都在同一个 session 中加载,那么替换集合可能就像:
x.ListOfObjectYs.Clear();
foreach (ObjectY y in newObjectYList)
{
x.ListOfObjectYs.Add(y);
}
_session.Flush();
关于c# - 在 nhibernate 中,无法更新子对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4405234/