2015-10-16 18 views
0

我只是不能決定選擇哪種方法來使用具有部分不同對象類型的分層樹。應用程序是Asp.Net MVC,我首先使用實體​​框架代碼。我的分層樹是一個信息內容結構。樹中的每個節點都可以是我的三種實現類型之一。asp.net中的層次結構樹的哪個實體設計mvc-application

現在,每種類型的表(TPT)似乎是我最好的設計選擇,但是您認爲如何??我選擇的設計有什麼缺點?例如,基類應該有鑑別器字段嗎?

爲了說明,下面是我當前設計的一個僞示例。

問候,柯樂埃裏克森

public abstract class PageObject 
    { 
     public int ID { get; set; } 
     public int? ParentID { get; set; } 
     public string Title { get; set; } 
     public virtual PageObject Parent { get; set; } 
     public virtual ICollection<PageObject> Children { get; set; } 
    } 

    [Table("LinkPage")] 
    public class LinkPage : PageObject 
    { 
     public string Url { get; set; } 
    } 

    [Table("FramedPage")] 
    public class FramedPage : LinkPage 
    { 
     public int? MinHeight { get; set; } 
     public int? MinWidth { get; set; } 
    } 

    [Table("ContentPage")] 
    public class ContentPage : PageObject 
    { 
     [DataType(DataType.Html)] 
     [AllowHtml] 
     public string Content { get; set; } 
    } 

public class InheritanceMappingContext : DbContext 
{ 
    public DbSet<PageObject> PageObjects { get; set; } 
} 

回答

1

如果基本類具有鑑別器領域,例如?

您不必在使用任何這些方法時明確聲明它。當使用TPH方法時,Discriminator字段將由Entity Framework自動添加爲表字段,因爲它將所有內容存儲在1個表中,並且此字段的作用類似於指向此記錄所屬的類的指針。

現在,每種類型的表(TPT)似乎是我最好的設計選擇,但是 您怎麼看?

你應該認識到,這是完全基於意見的問題,而且這取決於你的需求。每種方法都有其優點,反之亦然。

TPH將爲您提供最佳性能,因爲所有數據均由1個查詢選擇而無需任何JOINS,但它要求子類中的屬性在數據庫中爲Nullable。此外TPH違反了第三範式(價格性能)

TPT戰略的主要優點是SQL模式是標準化的,但性能可以爲複雜的類層次結構不可接受的,因爲查詢始終需要跨多個表聯接

http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx

+0

我想我會給TPT一槍。我的「正常化」思維不喜歡破壞正常化形式,正如你所說,這種方法也沒有直接的錯誤。如果測試過程中性能下降,我想TPH將成爲救援。 – Clas