递归树NHibernate与Winforms组合框中的数据绑定

时间:2011-08-09 21:12:54

标签: winforms nhibernate nhibernate-mapping

经过几天的搜索和尝试,我需要提出问题,因为我没有选择。场景很简单:递归类别树。 树从单个表中获取,并且必须绑定到Winforms应用程序中的组合框。

NHibernate中的映射不是问题;树正确映射。绑定到组合框也有效。问题是,当我想保存类别时,我得到一个参数索引超出范围错误,这是可以理解的,因为从下面的列表中可以看出,NH正在使用属性和外键中的多个 - -one映射更新数据库,它们都引用同一列。

问题是我需要属性ParentGroupId来进行组合框的数据绑定,我还需要很多外键一对一的映射。 有谁遇到过类似的情况?我想我几乎已经尝试了任何可能的情况,但到目前为止还没有运气.....

班级:

public class ProductGroup : EntityBindable
{
    public virtual string GroupName { get; set; }
    public virtual ProductGroup _parentGroup { get; set; }
    public virtual IList<ProductGroup> _subGroups { get; set; }
    public virtual int ParentGroupId { get; set; }
}

映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Brickx.Model"      namespace="Brickx.Model">
  <class name="ProductGroup">
    <id name="Id" type="int" unsaved-value="0">
      <generator class="hilo">
      </generator>
    </id>

    <property name="GroupName" type="string" length="50" />
    <property name="ParentGroupId" type="Int32" />

    <many-to-one name="ParentGroup"
                 column="ParentGroupId"
                 class="ProductGroup" />

    <bag name="SubGroups" cascade="all, delete-orphan">
      <key column="ParentGroupId" />
      <one-to-many class="ProductGroup" />
    </bag>
  </class>
</hibernate-mapping>

1 个答案:

答案 0 :(得分:0)

您有两种选择:

1)从hbm文件中删除ParentGroupId映射。这样NHibernate现在甚至不会讨论这个属性,也不会给你带来任何问题。将你的组合框绑定到group.ParentGroup.Id。如果这不可能,您可以自己简单地实现此属性:

class ProductGroup {
    ...
    public virtual int ParentGroupId {
        get {
            if (_parentGroup != null) {
                return _parentGroup.Id;
            }
            return 0;
        }
    }
    ...
}

2)使用更新并将插入设置为false来映射'ParentGroupId':

<property name="ParentGroupId" type="Int32" update="false" insert="false"/>

请注意,您的映射可能不正确,您可能需要在“包”上添加反向属性。通过这种方式,您可以告诉NHibernate首先保持双向关联的“多对一”方面。尝试设置如下:

<bag name="SubGroups" cascade="all, delete-orphan" inverse="true" >