2014-06-26 53 views
0

我有一臺「廣告」用於存儲有關廣告的基本信息(如:姓名,摘錄,創建日期...),我需要儲存更多的詳細信息,在一個單獨的表,但,這是我的問題。廣告可以根據類型(出售,購買,出租......),類別(住宅,商業,...)而不同,因此,詳細信息也不同(例如:商業廣告不需要廚房區域屬性)。我想打幾個型號將描述詳細信息的特定類型或類別C#代碼MVC首先複合模式

這裏是我的廣告模式:

[Table("Adverts_Adverts")] 
public class Advert { 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid AdvertId { get; set; } 

    public virtual Metadata Metadata { get; set; } 

    [Required] 
    [DataType(DataType.Text)] 
    public String Name { get; set; } 

    [DataType(DataType.Html), AllowHtml] 
    public String Content { get; set; } 

    [ForeignKey("Section")] 
    public Guid SectionId { get; set; } 
    public virtual Section Section { get; set; } 

    [ForeignKey("Category")] 
    public Guid CategoryId { get; set; } 
    public virtual Category Category { get; set; } 

    [ForeignKey("Type")] 
    public Guid TypeId { get; set; } 
    public virtual Type Type { get; set; } 

    public Decimal Price { get; set; } 

    [DataType("Enum")] 
    public Currency Currency { get; set; } 

    [ForeignKey("Details")] 
    public Guid DetailsId { get; set; } 
    public virtual ?????????? Details { get; set; } 

    [ForeignKey("User")] 
    public String UserId { get; set; } 
    public virtual User User { get; set; } 

    [ReadOnly(true)] 
    [DataType(DataType.DateTime)] 
    public DateTime Added { get; set; } 

    [ReadOnly(true)] 
    [DataType(DataType.DateTime)] 
    public DateTime Updated { get; set; } 

    public Int32 Views { get; set; } 

    [ReadOnly(true)] 
    public Status Status { get; set; } 

    ... 
} 

這裏的住宅廣告我的詳細信息模型:

[Table("Adverts_Details")] 
public class ResidentialDetails { 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid DetailsId { get; set; } 

    [ForeignKey("Advert")] 
    public Guid AdvertId { get; set; } 
    public virtual Advert Advert { get; set; } 

    [Required] 
    public Int32 Storeys { get; set; } 

    [Required] 
    public Int32 Floor { get; set; } 

    [Required] 
    public Int32 Rooms { get; set; } 

    [Required] 
    public Decimal TotalArea { get; set; } 

    [Required] 
    public Decimal LivingArea { get; set; } 

    [Required] 
    public Decimal KitchenArea { get; set; } 

    ... 
} 

這可能適用於商業廣告:

[Table("Adverts_Details")] 
public class CommercialDetails { 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid DetailsId { get; set; } 

    [ForeignKey("Advert")] 
    public Guid AdvertId { get; set; } 
    public virtual Advert Advert { get; set; } 

    [Required] 
    public Int32 OfficesCount { get; set; } 

    [Required] 
    public Int32 Floor { get; set; } 

    [Required] 
    public Decimal TotalArea { get; set; } 

    ... 
} 

那麼,我該如何交流同時存在ResidentialDetails和CommercialDetails,廣告屬性「Details」中的數據?

(提前謝謝)

+1

你描述你所追求的方式並不清楚。也許向我們展示一個你希望能夠用你的代碼做什麼的例子,並解釋一下你感到困惑的部分? – Jakotheshadows

+0

對不起我的英語,我添加了一個例子 – lambidu

回答

1

這是一個結構問題,這是很難的沒有您的業務規則的完整的理解來回答。我可以給你一些一般的建議,希望能幫助你。

儘可能,消除複雜性。我不確定什麼是「廚房區域財產」,但是你能概括它嗎?根據上下文,您可以將其稱爲不同的東西,以不同的方式使用它等,但如果它只是一個文本字段,那麼您可以在其他上下文中重新調整它的用途。也許對於住宅廣告來說,這是「廚房區域」,而對於商業來說,這可能是「休息室區域」。 (我真的不知道這個屬性是用來做什麼的,但我只是想說明同一個屬性在不同的上下文中可能有相似但略有不同的含義)。

如果不能一概而論,那麼你就需要開始在繼承的戰略合作。創建一個對象圖。這些廣告類型和類別如何相關。他們有什麼不同。哪些人是其他人的超級羣體等?同樣,我不知道在遊戲業務規則的任何東西,但也許你需要像AdvertResidentialAdvert : AdvertCommercialAdvert : Advert類。然後,您可以根據需要向這些子類添加其他屬性。

您還需要對關係的戰略決定。默認情況下,EF將實現簡單繼承作爲STI(單表繼承,也稱爲每層次表或TPH)。換句話說,對於上面的類,您最終將得到一個Adverts表和Discriminator列。此列的值將是「Advert」,「ResidentalAdvert」或「CommercialAdvert」中的一個,指示應該實例化哪個類,但所有子類的所有列都駐留在同一個表中。好處是不需要連接,但不利之處在於您的子類中的所有其他列必須可以爲空或具有默認值。其他可能的策略包括每表類型(TPT),組合策略或每個具體類型表(TPC),其中每個子類型都有自己的唯一表,幷包含所有超類型的所有字段。

+0

TNX克里斯,「你最終會與廣告表鑑別欄」我的身份2.X我會努力......但需要了解更多周圍發現這一點: ) – lambidu