nHibernate 零或一对一使用代码映射

nHibernate Zero or One to one using mapping by code

我正在为一个人和一张死亡证明建模,其中一个人可以有零个或一个死亡证明。如果我有:

public class Person
{
  public string PersonId { get; set; }
  public virtual DeathCertificate { get; set; }
}

和:

public class DeathCertificate
{
  public string DeathCertificateId { get; set; }
  public string PersonId { get; set; }
  public virtual Person { get; set; }
}

其中DeathCertificateId是DeathCertificate在数据库中的主键。

此人的映射中包含以下内容:

  this.OneToOne(
    entity => entity.DeathCertificate,
    mapper =>
    {
      mapper.Access(Accessor.Property);
      mapper.Cascade(Cascade.Detach | Cascade.Persist);
      mapper.PropertyReference(p => p.Person);
      mapper.Constrained(false);
    });

这是死亡证明:

  this.ManyToOne(
    entity => entity.Person,
    mapper =>
    {
      mapper.Column("PERSON_ID");
      mapper.Cascade(Cascade.None);
      mapper.Unique(true);
    });

不幸的是,这会生成 SQL 每当我询问 person 我是否加入它时类似于以下内容:

select ...
from person p
left outer join deathcertificate dc
   on dc.person_id = p.person_id
where p.person_id = 'ABC123'

所以一切正常,但我只想要一张死亡证明,当我明确加入它时。

我想我的映射有问题。有人可以帮忙吗?

变化中:

mapper.Constrained(false);

mapper.Constrained(true);

DeathCertificate 映射解决了我的问题。

详情见https://ayende.com/blog/3960/nhibernate-mapping-one-to-one