【问题标题】:Fluent NHibernate Inheritance mapping typeFluent NHibernate 继承映射类型
【发布时间】:2015-05-23 06:09:35
【问题描述】:

我是 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);    
    }
}

【问题讨论】:

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


    【解决方案1】:

    互联网上关于Fluent mapping 和 NHibernate 继承的真正好文章很少。其中之一是关于mapping-by-code,但它也提供了关于Fluent mapping的详细解释(只需向下滚动)

    Mapping-by-Code - inheritance 作者:Adam Bar

    与您的场景相关的小摘录

    ... 每个班级的表格

    映射继承的第二种策略是每个类的表和连接的子类。在此选项中,子类存储在单独的表中,这些表具有基类表的外键,并在需要时与基类表连接。在这种情况下,在按代码映射中,我们必须通过继承 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);
        }
    }
    

    另一篇非常好且全面的文章:

    Inheritance mapping strategies in Fluent Nhibernate 作者:伊戈尔·伊格纳托夫


    但是,我建议:

    不要这样做。尽可能不要使用继承。如果必须 - 不要使用这么深的继承。

    请务必阅读:

    Composition over inheritance

    小引用:

    好处

    优先考虑组合而不是继承是一种设计原则,它赋予设计更高的灵活性,从长远来看,赋予业务领域类和更稳定的业务领域。换句话说,HAS-A 可以比 IS-A 关系更好。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      相关资源
      最近更新 更多