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。
我正在为一个人和一张死亡证明建模,其中一个人可以有零个或一个死亡证明。如果我有:
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。