流利的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;

所以我希望拥有可以使用的 TeacherStudent 对象,但我也希望能够跟踪它们以进行成员身份验证(因此是 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 映射类层次结构

一对零或一关系实体框架

流利的 nhibernate 1.4 中的新功能

in (ASP.NET) 之外的流利 NHibernate 错误映射程序集

流利的 NHibernate 多对多创建附加表