nhibernate中使用复合键的自反n:m关系

nhibernate中使用复合键的自反n:m关系,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我有一个包含3个表的旧数据库,如下所示: (来源:) “项目”表包含计划中的所有项目。 结构表定义了项目之间的关系。 父项由表结构的公司、年度、计划id和父项映射到公司、年度、计划id表项定义 子项由表结构的映射到公司,年,计划id和子项定义,映射到表项目的年,计划id 我正在寻找一种使用hbm或fluent映射在nhibernate中进行n:m映射的方法 我想到了: <?xml version="1.0" encoding="utf-8"?> <hibernate-mapp

我有一个包含3个表的旧数据库,如下所示:

(来源:)

“项目”表包含计划中的所有项目。 结构表定义了项目之间的关系。 父项由表
结构的
公司
年度
计划id
父项
映射到
公司
年度
计划id
定义
子项由表
结构的
映射到
公司
计划id
子项
定义,映射到表
项目的
计划id

我正在寻找一种使用hbm或fluent映射在nhibernate中进行n:m映射的方法

我想到了:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping namespace="Project.Model" assembly="Project" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Item" lazy="true" table="`item`" schema="`dbo`">
    <composite-id>
        <key-property name="Company" column="`company`" />
        <key-property name="Year" column="`year`" />
        <key-property name="Planid" column="`planid`" />
        <key-property name="ItemId" column="`id`" />
    </composite-id>  
    <!-- Some other properties -->

    <set name="Parents" table="`structure`" fetch="select">
        <key>
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`parentItem`" />
        </key>
        <many-to-many class="Item">        
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`id`" />
        </many-to-many>
    </set>

    <set name="Childs" table="`structure`" fetch="select">
        <key>
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`childItem`" />
        </key>
        <many-to-many class="Item">        
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`id`" />
        </many-to-many>
    </set>

    <many-to-one name="Plan" class="Plan" not-null="true" fetch="select">
        <column name="`company`" />
        <column name="`planid`" />
    </many-to-one>
  </class>
</hibernate-mapping>


但是错误是:
映射中的重复列…
-所以我被卡住了。有什么建议吗?

我设法解决了这个问题。关键是使用键多对一(FluentNHibernate中的键引用)和not来进行n:m映射(因为它不起作用!):



这看起来有点奇怪,尤其是公司、年份和计划在结构中的关键部分。但它很有效…

我设法解决了这个问题。关键是使用键多对一(FluentNHibernate中的键引用)和not来进行n:m映射(因为它不起作用!):


这看起来有点奇怪,尤其是公司、年份和计划在结构中的关键部分。但它是有效的

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping namespace="Project.Model" assembly="Project" xmlns="urn:nhibernate-mapping-2.2">
<class name="Item" lazy="true" table="`item`" schema="`dbo`">
  <composite-id>
    <key-many-to-one name="Plan" class="Plan">
      <column name="Company" column="`company`" />
      <column name="Planid" column="`planid`" />
    </key-many-to-one>
    <key-property name="Year" column="`year`" />
    <key-property name="ItemId" column="`id`" />
  </composite-id>  
  <!-- Some other properties -->

  <set name="Parents" table="`structure`" fetch="select">
    <key>
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`parentItem`" />
    </key>
    <many-to-many class="Item">        
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`id`" />
    </many-to-many>
  </set>

  <set name="Childs" table="`structure`" fetch="select">
    <key>
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`childItem`" />
    </key>
    <many-to-many class="Item">        
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`id`" />
    </many-to-many>
  </set>
  </class>

  <class name="Structure" lazy="true" table="`item`" schema="`dbo`">
    <composite-id>
  <key-many-to-one name="Parent" class="Item">
    <column name="company" />
    <column name="year" />
    <column name="planid" />
    <column name="parentItem" />
  </key-many-to-one>
  <key-many-to-one name="Child" class="Item">
    <column name="company" />
    <column name="year" />
    <column name="planid" />
    <column name="childItem" />
  </key-many-to-one>
  <key-property name="StructureId" column="structureId" />
</composite-id>      
</class>

</hibernate-mapping>