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