流畅的NHibernate继承映射类型

时间:2015-03-19 22:37:24

标签: c# nhibernate fluent-nhibernate fluent fluent-nhibernate-mapping

我是Fluent NHibernate的新手,到目前为止我设法让我的映射工作除了继承部分。有没有人可以帮我完成映射?我尽可能地简化了代码。

谢谢!

我的数据库:

CREATE TABLE [User] (
UserID                  INT             NOT NULL IDENTITY(1,1),
Type                    CHAR(1)         NOT NULL,
Email                   VARCHAR(255)    NOT NULL,
PRIMARY KEY(UserID)
);

CREATE TABLE [Student] (
UserID                  INT             NOT NULL,
Firstname               VARCHAR(255)    NOT NULL,
PRIMARY KEY(UserID),
FOREIGN KEY(UserID) REFERENCES [User](UserID)               
);

CREATE TABLE [Company] (
UserID                  INT             NOT NULL,
Name                    VARCHAR(255)    NOT NULL,
PRIMARY KEY(UserID),
FOREIGN KEY(UserID) REFERENCES [User](UserID),
);

我的课程:

public class User
{
    public virtual int UserID { get; set; }
    public virtual UserType Type { get; set; }
    public virtual string Email { get; set; }
    public User()
    {
    }
}

public class Student : User
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public Student() 
        : base()
    {

    }
}

public class Company : User
{
    public virtual string Name { get; set; }
    public Company() 
        : base()
    {
    }
}

public enum UserType
{
    STUDENT = 0,
    COMPANY = 1
}

映射:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Table("[User]");
        Id(x => x.UserID);
        Map(x => x.Type).CustomType<int>();
        Map(x => x.Email);
    }
}

public class CompanyMap : ClassMap<Company>
{
    public CompanyMap()
    {
        Table("Company");
        Id(x => x.UserID);
        Map(x => x.Name);

    }
}

public class StudentMap: ClassMap<Student>
{
    public StudentMap()
    {
        Table("Student");
        Id(x => x.UserID);
        Map(x => x.Firstname);
        Map(x => x.Lastname);    
    }
}

1 个答案:

答案 0 :(得分:4)

互联网上关于 Fluent mapping 和NHibernate继承的文章很少。其中一个约为mapping-by-code,但它提供了有关 Fluent mapping 的详细说明以及(只是向下滚动)

Adam Bar

Mapping-by-Code - inheritance

与您的方案相关的小提取

  

...   每个班级的表格

     

映射继承的第二个策略是每个具有连接子类的类的表。在此选项中,子类存储在具有基类表的外键的单独表中,并且如果需要,则与基表的表连接。在这种情况下,在按代码映射时,我们必须通过继承JoinedSubclassMapping来映射子类。以下是使用所有可用选项的连接子类映射的示例:

public class CompanyMap : JoinedSubclassMapping<Company>
{
    public CompanyMap()
    {
        Key(k =>
        {
            k.Column("PartyId");
            // or...
            k.Column(c =>
            {
                c.Name("PartyId");
                // etc.
            });

            k.ForeignKey("party_fk");
            k.NotNullable(true);
            k.OnDelete(OnDeleteAction.Cascade); // or OnDeleteAction.NoAction
            k.PropertyRef(x => x.CompanyName);
            k.Unique(true);
            k.Update(true);
        });

        Property(x => x.CompanyName);
    }
}

另一篇非常好的综合文章:

Igor Ignatov

Inheritance mapping strategies in Fluent Nhibernate


但我建议:

  

请勿这样做。如果可能,请不使用继承。如果必须 - 不要使用如此深的继承。

请读这个:

Composition over inheritance

小引用:

  

<强>优势

     

支持组合优于继承是一种设计原则,它为设计提供了更高的灵活性,从长远来看,提供了业务领域类和更稳定的业务领域。换句话说,HAS-A可能比IS-A关系更好。

     

通过在单独的接口中识别系统对象行为而不是创建层次关系来通过继承在业务域类之间分发行为来简化初始设计。这种方法更容易适应未来的需求变更,否则需要在继承模型中完全重构业务域类。此外,它避免了通常与包含几代类的基于继承的模型的相对较小的更改相关的问题。

NHibernate是一个非常棒的工具,几乎支持我们的任何愿望......但它仍然不应该意味着我们应该使用它。