【问题标题】:hierarchal zero-to-one relationship in fluent NHibernate流利的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 基类)。

所以两个问题:

  1. 这是一种合理的方式来做我想做的事吗?

  2. 如果是这样,如何使用 Fluent nHibernate 进行映射?

【问题讨论】:

  • 为什么 User 是基类而不是接口?在同一个类(Id 和 UserId)上看到 2 个 Id 看起来很奇怪#
  • @Firo 是的,实际上我已经把它变成了一个抽象类(因为我想把成员逻辑保留在那里)并取出子类上的 UserIds(我只是把它放在那里,因为我认为 NHibernate 会去需要它)

标签: c# .net nhibernate orm fluent-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。很好的答案!
猜你喜欢
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多