簡體   English   中英

流利的NHibernate繼承映射類型

[英]Fluent NHibernate Inheritance mapping type

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

互聯網上很少有關於Fluent mapping和NHibernate繼承的好文章。 其中之一是關於mapping-by-code ,但是它也提供了有關Fluent mapping詳細說明(向下滾動)。

代碼映射 -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);
    }
}

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

Igor Ignatov編寫的Fluent Nhibernate中繼承映射策略


但是,我建議:

不要這樣走。 如果可能, 不要使用繼承 如果必須-不要使用那么深的繼承。

請閱讀以下內容:

組成重於繼承

小引用:

好處

在繼承中優先考慮組成是一種設計原則,該原則賦予設計更高的靈活性,從長期來看,提供業務域類和更穩定的業務域。 換句話說,HAS-A可能比IS-A關系更好。

通過在單獨的界面中標識系統對象行為,而不是創建層次結構關系以通過繼承在業務域類之間分配行為,簡化了初始設計。 這種方法更容易適應將來的需求更改,否則將需要在繼承模型中對業務域類進行完整的重組。 此外,它避免了通常與對包含幾代類的基於繼承的模型進行相對較小更改有關的問題。

NHibernate是一個非常強大的工具,幾乎可以支持我們的任何願望……但是它仍然不意味着我們應該使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM