Nhibernate 一对一映射代码

问题描述 投票:0回答:2

当引用列不是第二个表上的主键列时,我试图找出一种在 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; }
}

基于解释表这篇文章我定义了关系映射如下但是没有用

人物映射:

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 具有相同的值,但在我的例子中它们是不同的。在这种情况下,我如何使用代码映射来定义我的映射。

c# sql nhibernate fluent-nhibernate nhibernate-mapping-by-code
2个回答
0
投票

我知道这是一个非常古老的问题,但我浪费了太多时间试图解决这个问题,所以我还是添加了我的解决方案。

人物映射:

OneToOne(x => x.Passport, m =>
{
    m.Access(Accessor.Property);
    //if you are running an older version of NHibernate like 3.3.4 you might need to do it this way
    //m.PropertyReference(typeof(Passport).GetProperty("Person"));  
    m.PropertyReference(p => p.Person);
    m.Constrained(false);
});

护照映射:

ManyToOne(x => x.Person, m =>
{
    m.Column("PersonId")
    m.Unique(true);
    m.NotFound(NotFoundMode.Ignore);
});

-1
投票

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

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

和护照:

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

希望这有帮助。 稍后,当你想创建一个新记录时,例如这样做:

 var person = new Person();
 person.Passport = new Passport(){Person = person};
© www.soinside.com 2019 - 2024. All rights reserved.