通过代码nhibernate 3.2的OneToOne映射

Bas*_*Bas 4 nhibernate

我正在尝试升级项目并使用构建代码映射器.

我有2个实体:

public class Person {
 public virtual int Id { get; set; }
 public virtual User User { get; set; }
}

public class User {
 public virtual int Id { get; set; }
 public virtual User Person { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

数据库结构如下:

table: users, fields: id
table: people, fields: id, userId
Run Code Online (Sandbox Code Playgroud)

使用FluentNHibernate我可以像这样映射它:

public class UserMap : ClassMap<User> {
 public UserMap() {
  Id(x => x.Id).GeneratedBy.Identity();
  HasOne(x => x.Person).PropertyRef("User").Not.LazyLoad();
 }
}

public class PersonMap : ClassMap<Person> {
 public PersonMap() {
  Id(x => x.Id).GeneratedBy.Identity();
  References(x => x.User).Column("UserId").Not.Nullable().Not.LazyLoad();
 }
}
Run Code Online (Sandbox Code Playgroud)

但是无法让它在代码映射器中使用NH 3.2构建.这就是我到目前为止所做的.

OneToOne(x=>x.Person, m => {
 m.PropertyReference(typeof(Person).GetProperty("User"));
});

OneToOne(x=>x.User, m => {});
Run Code Online (Sandbox Code Playgroud)

现在关系映射到User.Id和Person.Id,但personid和userid可以不同.用户也可能没有人.

from Users user0_ left outer join People person1_ on user0_.Id=person1_.Id 
Run Code Online (Sandbox Code Playgroud)

我想我必须指定Person - > User与UserId列映射但是如何?

Die*_*hon 5

由于您References()在Fluent 中使用,您需要将其转换为ManyToOne():

public class UserMap : ClassMapping<User>
{
    public UserMap()
    {
        Id(x => x.Id, x => x.Generator(Generators.Identity));
        OneToOne(x => x.Person,
                 x => x.PropertyReference(typeof(Person).GetProperty("User")));
    }
}

public class PersonMap : ClassMapping<Person>
{
    public PersonMap()
    {
        Id(x => x.Id, x => x.Generator(Generators.Identity));
        ManyToOne(x => x.User,
                  x => x => { x.Column("UserId"); x.NotNullable(true); });
    }
}
Run Code Online (Sandbox Code Playgroud)

两个笔记: