Nhibernate 使用每个表的主键进行一对一或多对一映射

Nhibernate 使用每个表的主键进行一对一或多对一映射,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有一个包含主表和次表的遗留模式,其中次表通过具有相同的主键连接到主表(对于给定的主表,次表不一定存在)。我一直在上下搜索XML映射,这些映射可以使这项工作正常进行,但没有找到任何适合我的映射 <class name="Secondary" table="Secondary" lazy="true" dynamic-insert="true" dynamic-update="true"> <id name="mainId" type="Int32">

我有一个包含主表和次表的遗留模式,其中次表通过具有相同的主键连接到主表(对于给定的主表,次表不一定存在)。我一直在上下搜索XML映射,这些映射可以使这项工作正常进行,但没有找到任何适合我的映射

  <class name="Secondary" table="Secondary" lazy="true" dynamic-insert="true" dynamic-update="true">
    <id name="mainId" type="Int32">
      <column name="MAIN_ID" not-null="true" />
      <generator class="foreign">
        <param name="property">Main</param>
      </generator>
    </id>
    <one-to-one class="Main" name="Main" constrained="true" />
  </class>


  <class name="Main" table="Main" lazy="true" dynamic-insert="true" dynamic-update="true">
    <one-to-one name="Secondary" cascade="all-delete-orphan" class="Secondary" />

请注意,它使用的是主表中的MAIN_ID,完全忽略了次表。

此问题在NHibernate 5.3中已修复

这是一个已知的(带有建议修复的PR)

现在,作为LINQ中的一种解决方法,您可以对一些非ID且不可为null的属性调用
Count

session.Query<Main>().Count(m => m.Secondary.NotNullableProperty != null)
session.Query().Count(m=>m.Secondary.NotNullableProperty!=null)
如果此类属性不存在(或者您只是想在将来轻松找到所有此类黑客用法),您还可以将Id列映射为只读属性并使用它:


session.Query().Count(m=>m.Secondary.ForceJoinId!=null)
session.Query<Main>().Count(m => m.Secondary.NotNullableProperty != null)
session.Query<Main>().Count(m => m.Secondary.ForceJoinId != null)