0

我正在使用 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 字段?谁能至少给我一些关于如何调试问题的提示?

4

1 回答 1

1

ContainerDocumentID是类上的 id,ContainerDocument但它不在LatestDocumentVersion类上,默认情况下,每个一对多加入到 id 上。添加property-refLatestDocumentVersion映射

<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>
于 2013-02-13T19:30:21.110 回答