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

leo*_*ora 6 c# nhibernate asp.net-mvc fluent-nhibernate

我有X其中类型的对象_对象具有属性ListOfObjectYs那一个

List<objectY>
Run Code Online (Sandbox Code Playgroud)

nhibernate映射看起来像这样:

    public ObjectXMap()
    {
        HasMany(x => x.ListOfObjectYs).AsBag().Inverse(); 
    }
Run Code Online (Sandbox Code Playgroud)

当我去保存它时,我在objectX上更改了一些属性,然后:

    Session.SaveOrUpdate(x);
Run Code Online (Sandbox Code Playgroud)

现在我需要更新这个列表的属性.我得到一个新的objectYs列表,我想用一个新列表替换现有的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();
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

是否有更好的方法来执行此更新,我需要更新对象(属性),但也更新列表中存在全新列表的属性(意味着需要删除和添加项目).

Jam*_*Ide 4

你的问题的答案是否定的。如果您想替换列表,您应该清除它并添加新项目。如果您将级联设置为 all-delete-orphan,如 James Kovacs 的回答所示,那么当会话刷新时,对集合的更改将被保留。

了解 NHibernate 中 Save、Update 和 SaveOrUpdate 的含义非常重要:

  • 保存 - 使新对象持久化
  • 更新 - 使更改的分离对象持久化
  • SaveOrUpdate - 根据对象标识符的未保存值保存或更新

另请参阅操作持久数据

假设所有对象都在同一个会话中加载,那么替换集合可能就像以下一样简单:

x.ListOfObjectYs.Clear();
foreach (ObjectY y in newObjectYList)
{
    x.ListOfObjectYs.Add(y);
}
_session.Flush();
Run Code Online (Sandbox Code Playgroud)

  • 如果 Y 对象是新的,那么您必须先保存它们以使它们持久化。该错误消息可能表明您正在某处重新分配集合引用,请参阅http://www.sleberknight.com/blog/sleberkn/entry/20070329和http://stackoverflow.com/questions/2127016/nhibernate-mapping -a-collection-with-cascadeall-delete-orphan-was-no-longer-r。 (3认同)