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

时间:2017-12-07 17:25:54

标签: c# nhibernate

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

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:

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

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

我认为我的映射中出现了问题。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

更改:

mapper.Constrained(false);

mapper.Constrained(true);
DeathCertificate映射上的

解决了我的问题。

有关详细信息,请参阅https://ayende.com/blog/3960/nhibernate-mapping-one-to-one