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