通过代码进行Nhibernate一对一映射
本文关键字:Nhibernate 一对一 映射 代码 | 更新日期: 2023-09-27 18:23:50
当引用列不是第二个表上的主键列时,我正试图找出一种方法来映射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));
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具有相同的值,但在我的情况下它们不同。在这种情况下,如何使用代码映射来定义映射。
我知道这是一个很老的问题,但我浪费了太多时间试图解决这个问题,所以我还是添加了我的解决方案。
人员映射:
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);
});
我希望我的帖子能对你有所帮助,我会向你展示我是如何进行这些映射的:人员映射:
HasOne(x=>x.Passport).Cascade.All();
护照:
References(x => x.Person).Unique();
希望这能有所帮助。稍后,当你想创建一个新记录时,可以这样做,例如:
var person = new Person();
person.Passport = new Passport(){Person = person};