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

时间:2014-09-19 18:45:38

标签: c# sql nhibernate fluent-nhibernate mapping-by-code

我试图找出一种在引用列不是第二个表上的主键列时在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我将关系映射定义如下,但它不起作用

PersonMapping:

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

PassportMapping:

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 个答案:

答案 0 :(得分:1)

我希望我的帖子能帮到你,我会告诉你我是如何做这些映射的: 人物映射:

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

和护照:

  References(x => x.Person).Unique();
希望这会有所帮助。 稍后,当您要创建新记录时,请执行以下操作:

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