通过代码进行 Nhibernate 一对一映射

Posted

技术标签:

【中文标题】通过代码进行 Nhibernate 一对一映射【英文标题】:Nhibernate One-To-One mapping by code 【发布时间】:2014-11-14 10:30:19 【问题描述】:

当引用列不是第二个表上的主键列时,我正在尝试找出一种在 nhibernate 中映射一对一关系的方法。

例如考虑

Person Table 
   PersonId (pk)
   Name

Passport Table 
   PassportId (pk)
   Country
   PersonId

这两个表在 PersonId 上是一一对应的关系。

我的 Nhibernate 模型如下所示。

public class Person

    public virtual int Id  get; set; 
    public virtual string Name  get; set; 
    public virtual Passport Passport  get; set; 


public class Passport

    public virtual int Id  get; set; 
    public virtual string Country  get; set; 
    public virtual Person Person  get; set; 

根据this article的解释表,我定义了如下关系映射,但它不起作用

人物映射:

OneToOne(x => x.Passport, x => x.Cascade(Cascade.All));

护照映射:

ManyToOne(x => x.Person, x =>  x.Unique(true); x.Column("PersonId"););

如下构造sql查询

select * from Person
left outer join  Passport on Persson.PersonId = Passport.PassportId.

它假定 PassportId 和 PersonId 具有相同的值,但在我的情况下它们是不同的。在这种情况下如何使用代码映射来定义我的映射。

【问题讨论】:

【参考方案1】:

我希望我的帖子对您​​有所帮助,我将向您展示我是如何进行这些映射的: 人的映射:

  HasOne(x=>x.Passport).Cascade.All();

还有护照:

  References(x => x.Person).Unique();

希望这会有所帮助。 稍后,当您要创建新记录时,请执行以下操作:

 var person = new Person();
 person.Passport = new Passport()Person = person;

【讨论】:

这个答案正在使用流利的 nhibernate,但问题是 Mapping By Code。

以上是关于通过代码进行 Nhibernate 一对一映射的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 通过代码 ManyToOne 与 CompositeIdentity 进行映射

nhibernate:一对一映射

Nhibernate 多对一映射返回重复值

如何让 Nhibernate 重建数据库?

NHibernate 中的 Lazy 是啥意思

NHibernate代码监视