gpt4 book ai didi

c# - 在 nhibernate 中,无法更新子对象列表

转载 作者:太空狗 更新时间:2023-10-29 21:30:41 24 4
gpt4 key购买 nike

我有 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();

我的问题是:

  1. 我是否必须删除所有内容并在添加新内容之前刷新。
  2. 我是否需要在两者之间进行所有这些增量保存

有没有更好的方法来执行此更新,我需要更新一个对象(属性),但也更新列表中的属性,其中有一个全新的列表(意味着需要删除和添加项目)。

最佳答案

您的问题的答案是否定的。如果您想替换列表,您应该清除它并添加新项目。如果您将 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/

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