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

标签 c# asp.net-mvc nhibernate fluent-nhibernate

我有 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/

相关文章:

c# - OrmLite.SqlServer 程序集出错

nhibernate - FluentNHibernate 多对一引用,其中外键不是主键,列名不同

c# - 如何在不进行大量重写的情况下在现有的 asp.net-mvc 站点上添加新路由?

c# - 这些数组方法有什么区别

jquery - 如何为日期时间选择器文本框应用样式

jquery - 点击按钮不触发jquery函数

c# - 如何覆盖NHibernate的类映射Where子句?

c# - ASP.NET:获取TreeNode的容器TreeView

c# - NHibernate 缓存问题

c# - 如何安装程序,以便在 Windows Vista/7 上以管理员权限启动时启动该程序