NHibernate:在SQL视图中映射一对多关系

时间:2013-02-11 17:38:31

标签: nhibernate nhibernate-mapping

我正在使用SQL视图,而且我对NHibernate,视图或数据库一般都不了解,以了解我的问题所在。我正在使用的视图曾经有一个字符串列," ExemptionCode"。现在,视图可能有许多免除代码。以下是新关系的XML映射:

<class name="LatestDocumentVersion" table="LatestDocumentVersion" mutable="false" schema-action="none">
    <id name="DocumentVersionID" type="Int32"/>        
    <property name="ContainerDocumentID" type="Int32"/>
    <!--<property name="ExemptionCode" length="10" />-->
    <set name="ExemptionCodes" cascade="all-delete-orphan" lazy="false" inverse="false">
      <key column="ContainerDocumentID"/>
      <one-to-many class="ContainerDocumentExemptions"/>
    </set>
    <--Properties omitted-->
</class>

这是ContainerDocumentExemptions类的映射:

<class name ="ContainerDocumentExemptions" lazy ="false">
  <id name ="ContainerDocumentExemptionID" type="Int32">
    <generator class="identity"/>
  </id>
  <many-to-one name="ContainerDocumentID" class="ContainerDocuments" column="ContainerDocumentID" cascade="none"/>
  <property name="ExemptionCode" length="10"/>
</class>

ContainerDocumentExemption类实际上与ContainerDocument对象具有双向一对多关系。这是另一端:

<class name="ContainerDocuments" lazy="false" table="ContainerDocuments">
    <id name="ContainerDocumentID" type="Int32">
        <generator class="identity"/>
    </id>
    <!--<property name="ExemptionCode" length="10" />-->
    <set name="Exemptions" cascade="all-delete-orphan" lazy="false" inverse="true">
      <key column="ContainerDocumentID"/>
      <one-to-many class="ContainerDocumentExemptions"/>
    </set>
    <--Properties omitted-->
</class>

将此行添加到ContainerDocuments类后,ContainerDocuments可以正确地写入和读取新的ContainerDocumentExemptions表:

public class ContainerDocuments {
    public virtual ISet<ContainerDocumentExemptions> Exemptions { get; set; }
    //Properties omitted
}

因此,我将此代码添加到LatestDocumentVersion类:

public class LatestDocumentVersion {
    public virtual int ContainerDocumentID { get; set; }
    public virtual ISet<ContainerDocumentExemption ExemptionCodes { get; set; }
    //properties omitted
}

LatestDocumentVersion是一个视图,它在一堆不同的表上执行内部联接和外部联接,并从每个表中获取一堆不同的列。 (创建视图的SQL非常复杂,并且希望与手头的问题无关。)新添加的LatestDocumentVersion.ContainerDocumentID(它是ContainerDocumentExemptions表中的外键)始终正确填充。但是,ExemptionCodes集合始终为空。

我感觉问题的一部分是ContainerDocumentExemptions类中的ContainerDocument反向引用。这可以阻止我在LatestDocumentVersion类中使用相同的映射吗?我认为将LatestDocumentVersion-ContainerDocumentExemptions关系单向化将缓解该问题,如果它是一个问题。那么如何填充LatestDocumentVersion.ExemptionCodes字段?至少有人能给我提示如何调试问题吗?

1 个答案:

答案 0 :(得分:1)

ContainerDocumentIDContainerDocument类中的id,但它不在LatestDocumentVersion类上,默认情况下,每个一对多连接在id上。将property-ref添加到LatestDocumentVersion映射

<class name="LatestDocumentVersion" table="LatestDocumentVersion" mutable="false" schema-action="none">
    <id name="DocumentVersionID" />
    <property name="ContainerDocumentID"/>
    <set name="ExemptionCodes" cascade="all-delete-orphan" lazy="false" inverse="false">
      <key column="ContainerDocumentID" property-ref="ContainerDocumentID"/>
      <one-to-many class="ContainerDocumentExemptions"/>
    </set>
</class>