通过代码实现 Nhibernate 一对一映射

rpi*_*pin 6 c# sql nhibernate fluent-nhibernate nhibernate-mapping-by-code

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

\n\n

例如考虑

\n\n
Person Table \n   PersonId (pk)\n   Name\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
Passport Table \n   PassportId (pk)\n   Country\n   PersonId\n
Run Code Online (Sandbox Code Playgroud)\n\n

这两个表在 PersonId 上具有一对一的关系。

\n\n

我的 Nhibernate 模型如下所示。

\n\n
public class Person\n{\n    public virtual int Id { get; set; }\n    public virtual string Name { get; set; }\n    public virtual Passport Passport { get; set; }\n}\n\npublic class Passport\n{\n    public virtual int Id { get; set; }\n    public virtual string Country { get; set; }\n    public virtual Person Person { get; set; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据本文的解释,我定义了关系映射如下,但它没有 \xe2\x80\x99 工作

\n\n

人员映射:

\n\n
OneToOne(x => x.Passport, x => x.Cascade(Cascade.All));\n
Run Code Online (Sandbox Code Playgroud)\n\n

护照映射:

\n\n
ManyToOne(x => x.Person, x => { x.Unique(true); x.Column("PersonId");});\n
Run Code Online (Sandbox Code Playgroud)\n\n

它正在构建 sql 查询,如下所示

\n\n
select * from Person\nleft outer join  Passport on Persson.PersonId = Passport.PassportId.\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Eru*_*Eru -2

我希望我的帖子能对您有所帮助,我将向您展示我是如何进行此类映射的:人员映射:

  HasOne(x=>x.Passport).Cascade.All();
Run Code Online (Sandbox Code Playgroud)

和护照:

  References(x => x.Person).Unique();
Run Code Online (Sandbox Code Playgroud)

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

 var person = new Person();
 person.Passport = new Passport(){Person = person};
Run Code Online (Sandbox Code Playgroud)

  • 这个答案使用的是流利的nhibernate,但问题是按代码映射。 (6认同)