流利的NHibernate中的层次零对一关系
Posted
技术标签:
【中文标题】流利的NHibernate中的层次零对一关系【英文标题】:hierarchal zero-to-one relationship in fluent NHibernate 【发布时间】:2013-07-18 16:37:19 【问题描述】:我对 nHibernate 有点陌生,特别流利,我在映射类 A
扩展类 B
的关系时遇到问题,但不能保证给定的 A
也是B
。这是迄今为止结构的一个想法(并且可以提出建议):
public class User
public virtual Guid Id;
public virtual string UserName;
public virtual string HashedPassword;
//...
public class Student : User
public virtual Guid UserId;
public virtual School School;
public virtual float GPA;
public class Teacher : User
public virtual Guid UserId;
public virtual School School;
public virtual string ClassName;
所以我希望拥有可以使用的 Teacher
和 Student
对象,但我也希望能够跟踪它们以进行成员身份验证(因此是 User
基类)。
所以两个问题:
这是一种合理的方式来做我想做的事吗?
如果是这样,如何使用 Fluent nHibernate 进行映射?
【问题讨论】:
为什么 User 是基类而不是接口?在同一个类(Id 和 UserId)上看到 2 个 Id 看起来很奇怪# @Firo 是的,实际上我已经把它变成了一个抽象类(因为我想把成员逻辑保留在那里)并取出子类上的 UserIds(我只是把它放在那里,因为我认为 NHibernate 会去需要它) 【参考方案1】:选项 1
public class UserMap : ClassMap<User>
public UserMap()
Table("Users");
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.HashedPassword);
public class StudentMap : SubclassMap<Student>
public StudentMap()
Table("Students");
References(x => x.School);
Map(x => x.GPA);
public class TeacherMap : SubclassMap<Teacher>
...
表格
Users (
Id, // PK
Name,
HashedPassword
)
Students (
User_Id, // PK, FK
School_id,
Gpa
)
选项 2
public class UserMap : ClassMap<User>
public UserMap()
Table("Users");
DiscriminateSubclassesOnColumn("UserType", "user");
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.HashedPassword);
public class StudentMap : SubclassMap<Student>
public StudentMap()
DiscriminatorValue("student");
References(x => x.School);
Map(x => x.GPA);
public class TeacherMap : SubclassMap<Teacher>
...
表格
Users (
Id, // PK
UserType,
Name,
HashedPassword
School_id,
Gpa
Classname
)
选项 3
public abstract class UserMap<TUser> : ClassMap<TUser> where TUser : User
public UserMap()
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.HashedPassword);
public class StudentMap : UserMap<Student>
public StudentMap()
Table("Students");
References(x => x.School);
Map(x => x.GPA);
public class TeacherMap : UserMap<Teacher>
...
表格
Students (
Id, // PK
Name,
HashedPassword
School_id,
Gpa
)
Teachers (
Id, // PK
Name,
HashedPassword
School_id,
Classname
)
【讨论】:
我昨天做了一些研究,最终选择了选项 2。很好的答案!以上是关于流利的NHibernate中的层次零对一关系的主要内容,如果未能解决你的问题,请参考以下文章
处理遗留数据库时在 NHibernate 中建模多对一关系的最佳方法?
使用 2 种策略通过 fluent nhibernate 映射类层次结构