gpt4 book ai didi

nhibernate - 通过代码 nhibernate 3.2 进行 OneToOne 映射

转载 作者:行者123 更新时间:2023-12-03 09:52:37 26 4
gpt4 key购买 nike

我正在尝试升级项目并使用内置代码映射器。

我有 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; }
}

数据库结构是这样的:
table: users, fields: id
table: people, fields: id, userId

使用 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();
}
}

但是不能让它与代码映射器中的 NH 3.2 一起工作。
这是我到目前为止所做的。
OneToOne(x=>x.Person, m => {
m.PropertyReference(typeof(Person).GetProperty("User"));
});

OneToOne(x=>x.User, m => {});

现在关系映射在 User.Id 和 Person.Id 上,但 personid 和 userid 可以不同。
用户也可能没有人。
from Users user0_ left outer join People person1_ on user0_.Id=person1_.Id 

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

最佳答案

由于您在 Fluent 中使用 References() ,您需要将其转换为 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); });
}
}

两个注意事项:
  • User.Person 的类型应该是 Person ,而不是 user (这可能只是一个错误的编辑)
  • .Not.LazyLoad() 几乎总是一个坏主意。见 NHibernate is lazy, just live with it
  • 关于nhibernate - 通过代码 nhibernate 3.2 进行 OneToOne 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7944787/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com