Winforms combobox中带数据绑定的递归树NHibernate

Winforms combobox中带数据绑定的递归树NHibernate,winforms,nhibernate,nhibernate-mapping,Winforms,Nhibernate,Nhibernate Mapping,经过几天的搜索和尝试,我需要问这个问题,因为我没有选择。场景很简单:递归类别树。 树是从单个表中获取的,必须绑定到Winforms应用程序中的组合框 NHibernate中的映射不是问题;该树已正确映射。同时,对组合框的绑定也起作用。问题是,当我想保存类别时,我得到了一个参数索引超出范围的错误,这是可以理解的,因为从下面的列表中可以看出,NH在多对一映射中同时使用属性和外键来更新数据库,它们都指向同一列。问题在于,我需要属性ParentGroupId来进行组合框的数据绑定,而且我还需要多对一映射

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

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

问题在于,我需要属性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从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" >

德米特里,谢谢你的快速回复。我已经尝试了update=false和inverse=true,但都没有运气。更新为false时,新选择的父项不会保存到数据库中。好的是,我也不会收到错误消息;。我想我也试过group.ParentGroup.Id,但明天我会再试试。我会向你汇报的。