2012-02-12 62 views
1

我試圖找出如何我可以重新使用一個簡單的多個場景中的東西是「commentable」在我的應用「註釋」實體類型。實體框架4.1 - 分離的實體到多個表(代碼優先)

目前,我有幾個實體,一個用戶可以發表評論到。示例包括博客,個人資料和照片 - 這些都可以「註釋」。

我希望能夠使用相同的「評論」類每一種方案的,但我不想與一個巨大的滿桌子的一切意見結束。我想,這將是更有效存儲至少BlogComments,PhotoComments和ProfileComments表。此刻,我的評論類看起來是這樣的:

public class Comment 
{ 
    [Key] 
    public int Id { get; set; } 

    public int ContextId { get; set; } 

    [StringLength(256)] 
    public string Content { get; set; } 

    public DateTime DatePosted { get; set; } 

    public virtual Member Author { get; set; } 
} 

據推測,我需要的「CONTEXTID」字段來指代特定的事情被評論。此ID可能是博客,個人資料或照片的ID。我希望能夠參考意見很像這些類正常ICollection的,我有一些像這樣的代碼,照片爲例:

public class Photo 
{ 
    [Key] 
    public int Id { get; set; } 

    [StringLength(48)] 
    public string FileName { get; set; } 

    public virtual Member Owner { get; set; } 

    public virtual ICollection<Comment> Comments { get; set; } 
} 

期間我一直指出的各種物品我搜索,但沒有一個真正與我的特定情況有關。我怎麼能這些評論集合映射到不同的表,並避免評論「超表」?

任何幫助,指針或建議將非常感激:)

回答

1

您可以創建一個抽象類Comment並從它繼承如PhotoCommentProfileComment具體意見。您將能夠將註釋映射到不同的表格。

public abstract class Comment 
{ 
    [Key] 
    public int Id { get; set; } 

    [StringLength(256)] 
    public string Content { get; set; } 

    public DateTime DatePosted { get; set; } 

    public virtual Member Author { get; set; } 
} 


public class PhotoComment : Comment 
{ 
    public int PhotoId { get; set; } 

    public virtual Photo Photo { get; set; } 
} 


public class Photo 
{ 
    [Key] 
    public int Id { get; set; } 

    [StringLength(48)] 
    public string FileName { get; set; } 

    public virtual Member Owner { get; set; } 

    public virtual ICollection<PhotoComment> Comments { get; set; } 
} 
+0

輝煌!這是一個非常好的簡單解決方案。我非常複雜的問題 - 謝謝:) – Alex 2012-02-12 13:27:07

相關問題