首页 > 解决方案 > 具有相同 ID 键字段的多对多

问题描述

如何在 nHibernate 中将两个表连接为多对一和一对多。它们都具有与键列相同的“PLAN_ID”。我的数据库结构预先存在。

下面是我正在使用的映射和我得到的错误:

表:PLANN

PLAN_ID  <-- PRIMARY KEY
START_DATE
CHECK_CHAR
...

表:PLANN_DOCUMENT对许多

PLAN_ID <-- PRIMARY KEY
DOC_ID <-- ID to a DOCUMENT table
DOC_NAME
DOC_TYPE

计划类:

public virtual... PlanId, StartDate, CheckChar, PlanStatus,
public virtual ISet<DocsysHoldingDoc> DocsysHoldingDocs { get; set; }
public virtual DocsysHoldingDoc DocsysHoldingDoc { get; set; }

PlannDocument 类:

public virtual...PlanId, DocId, DocName, DocType
public virtual Plann PlannItem { get; set; }

规划 HBM XML

<class name="Plann" abstract="true" table="PLANN">
    <id name="PlanId" column="PLAN_ID"
        <generator class="assigned"/>
    </id>
    <property name="StartDate" column="START_DATE" /> 
    <property name="CHECK_CHAR" column="CHECK_CHAR" /> 
    ...

    <set name="PlannDocument" table="PLANN_DOCUMNET">
        <key column="PLAN_ID"></key> //<<KEY IN JOINING TABLE BUT ALSO ID IN THIS TABLE
        <one-to-many class="DocsysHoldingDoc"/>
     </set>
</class>

计划文档 HBM XML

<class name="PlannDocument" abstract="true" table="PLANN_DOCUMNET">
    <id name="PlanId" column="PLAN_ID"  type = "int">
        <generator class="assigned"/>
    </id>
    <property name="DocId" column="DOC_ID" />
    <property name="DocName" column="DOC_NAME" />
    <property name="DocType" column="DOC_TYPE" />

    <many-to-one name="Plann" column="PLAN_ID"></many-to-one>

</class>

错误:NHibernate.MappingException:“无法为类 <>.PlannDocument 构建插入语句:添加类的 Id 时发生故障”

ArgumentException:此 SQL 构建器中已添加列“PLAN_ID”参数名称:columnName

我在这里做错了吗?

标签: nhibernateorm

解决方案


如果您对identifier所需many-to-one的关联有相同的列 - 它并不是真正的many-to-one关联。共享相同identifier意味着它的one-to-one关联。只需使用它代替您many-to-one在 PlannDocument.hbm.xml 中的映射,它应该可以工作:

<one-to-one name="Plann" constrained="true" />

如果你PlannDocument.Plann可以为空而不是使用constrained="false"。但请注意,这将花费您额外的查询来检查是否Plann确实存在。


推荐阅读