【问题标题】:Delete a child record from the parent collection从父集合中删除子记录
【发布时间】:2010-11-02 10:20:37
【问题描述】:

我正在开发一个示例应用程序,以便了解 NHibernate 的来龙去脉。我正在努力解决删除问题。我希望能够通过将子记录从其父集合中删除然后保存父记录来删除它。我已经建立了一个双向的一对多关系,并且插入/更新效果很好。

这是我的映射

篮子:

<bag name="Items" inverse="true" cascade="all"> <key column="BasketId" /> <one-to-many class="BasketItem" /> </bag>

篮子物品:

&lt;many-to-one not-null="true" name="Basket" column="BasketId" /&gt;

我想打电话给basket.RemoveBasketItem(BasketItem item) 然后Session.SaveUpdate(basket) 以便删除购物篮项目。这可能吗?

【问题讨论】:

    标签: nhibernate parent-child


    【解决方案1】:

    cascade="all" 更改为cascade="all-delete-orphan"

    cascade="all" 只会在父级被删除时删除您的子级记录。

    【讨论】:

    • 当我的 RemoveBasketItem 看起来像这样: this.basketItems.Remove(itemToRemove);我收到此错误:拥有实体实例不再引用具有 cascade="all-delete-orphan" 的集合:Basket.Items
    • 听起来你以某种方式覆盖了IList 引用保存你的篮子物品。当列表引用为空时,您只能将自己的 IList 实现放在那里 - 如果您从数据库加载篮子,NH 会将自己的 PersistentBag 作为 IList 实现 - 您必须保留此引用单独让级联正常工作。
    • 我让它工作了!感谢您的帮助 :-) 我遇到了问题,因为我的 basket.Items 属性正在更新一个只读列表。现在我只是返回我的项目的私有实例。
    • 此更改意味着我的购物篮商品可以通过客户端代码进行修改 :-( basket.Items.Add()。我需要进一步研究一下。
    • 我通常创建 AddItem/RemoveItem 方法,然后让我的属性只返回一个 IEnumerable - 这样,消费代码必须新建他们自己的 List 或他们想做的任何事情,并且他们永远不要意外修改持久列表。
    【解决方案2】:

    我有相同的场景,我在 bagList 中使用了 cascade="all-delete-orphan" 但是当我删除集合中的单个子项时,它也会删除父对象。

    【讨论】:

    • 确保您的子对象具有 cascade="none"
    • 感谢您的评论....这是大多数在线条目中缺少的链接!!!
    • 正如乔纳森所说,+100 万,帮助我解决了大多数在线资源未提及的问题。谢谢!
    【解决方案3】:

    我遇到了与 initforthemoney 相同的问题,因为我从我的集合 getter 中返回了一个作为 ReadOnly 的新列表。我发现我可以通过将集合的属性访问策略从 nosetter 更改为 field 来继续使用 ReadOnly 列表。

    【讨论】:

      【解决方案4】:

      我的子元素返回 Ordered 可枚举时遇到问题。

      private readonly IList<Child> children;
      
      public virtual IEnumerable<Child> Children { get { return children.OrderBy(c => c.Position); } }
      
      public virtual void DeleteChild(Child item)
      {
          children.Remove(item);
      }
      

      我将排序移动到我的映射中,并按 IEnumerable 的原样返回子级。这对我有用!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-27
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多