【问题标题】:Nhibernate - Mapping List doesn't update List indexesNhibernate - 映射列表不更新列表索引
【发布时间】:2010-11-22 04:48:54
【问题描述】:

我有一个自引用课程。一个孩子有一个对它的父母的引用,一个父母有一个孩子的列表。由于子列表是有序的,我正在尝试使用 NHibernate 映射关系。

这是我的映射:

<class name="MyClass">
  <id name="Id">
    <generator class="native"/>
  </id>
  <list name="Children" cascade="delete" inverse="true">
    <key column="ParentId"/>
    <index column="ListOrder"/>
    <one-to-many class="MyClass"/>
  </list>
  <many-to-one name="Parent" class="MyClass" column="ParentId"/>
</class>

我遇到的问题是当我有一个双向映射子父时,当我进行 CRUD 舞蹈时,数据库中的列表索引 (ListOrder) 没有更新。这意味着当我例如删除一个孩子,在保存到数据库并再次获取父级后,我在子级列表中出现了漏洞。如果我删除双向性,通过从子级到父级没有多对一(并且没有 inverse=true),ListOrder 会正确更新。

你们中有人见过吗?有没有简单的解决办法?

【问题讨论】:

  • 它因为 inverse=true,不确定最好的解决方案是什么,目前有完全相同的问题。敬请期待
  • 是的,这是因为 inverse=true。如果删除了 bidir,一切都会像我希望的那样工作,ListOrder-wise。问题是我必须自己实现 children 属性,我不想这样做。

标签: nhibernate nhibernate-mapping mapping orm


【解决方案1】:

是的,这是因为 inverse=true,另一种解决方案是使用 set 或 bag 而不是带有 order="ListOrder" 的列表,将 ListOrder 列作为属性添加到 MyClass 类中,并带有一个空的 setter 和一个getter 总是从它的父子集合返回它的索引。像这样:

<class name="MyClass">
    <id name="Id">
        <generator class="native"/>
    </id>
    <bag name="Children" cascade="delete" inverse="true" order-by="ListOrder">
        <key column="ParentId"/>
        <one-to-many class="MyClass"/>
    </bag>
    <property name="ListOrder" column="ListOrder"/>
    <many-to-one name="Parent" class="MyClass" column="ParentId"/>
</class>

和班级

public class MyClass
{
    public virtual int ID { get; set; }
    public virtual IList<MyClass> Children { get; set; }
    public virtual MyClass Parent { get; set; }

    public virtual int ListOrder
    {
        get
        {
            if (Parent == null || !Parent.Children.Contains(this)) return -1;
            return Parent.Children.IndexOf(this);
        }
        set { }
    }
}

【讨论】:

  • 感谢您的建议。在我今天的代码中,我在添加/删除子项时使用钩子来正确设置 ListOrder。我基本上通过在我的域中添加逻辑来解决 NHibernate 无法按预期工作的问题。您的建议是另一个域层解决方法。它可能比我的更好,但仍然是一种解决方法。如果我的列表的语义是一个列表,我想将它映射为一个列表,而不是一个排序包。
  • 我喜欢房产理念
猜你喜欢
  • 2012-06-15
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多