2015-04-15 56 views
0

我想將我們所有網站的內容存儲在一箇中心內容表中,但將其與網站的每個部分相關聯。喜歡的東西:EF6 Code First:如何爲我的網站的不同部分集中內容?

  • 內容(實際內容的byte []和基本信息所有部分使用)
  • ResearchArticleContent(主要有從內容表中特定ResearchArticles相關內容識別和額外的cols的信息)
  • ResearchArticle
  • ExecutiveContent(主要有從內容表併爲管理人員的具體數據額外的cols相關內容識別)
  • 執行

...等等。 我無法理解整個代碼的第一種方法,因爲它涉及到ForeignKeys和InverseProperties。這是真正的問題。

所以,說我有這兩個類爲例:

public class Content 
{ 
    [Key] 
    public int ContentId { get; set; } 
    public int ContentType { get; set; }   
    public byte[] ContentBytes { get; set; } 
    public DateTime AddedDate { get; set; } 

    [**`InverseProperty or ForeignKey???`**("ResearchArticleContent")] 
    public virtual ResearchArticleContent ResearchArticleContent { get; set; }   
} 

和:

public class ResearchArticleContent 
{ 
    [Key] 
    public int ResearchArticleContentId { get; set; } 

    [ForeignKey("ContentId")] 
    public virtual Content Content {get;set;} 

    public int ResearchArticleId { get; set; } 
    [ForeignKey("ResearchArticleId")] 
    public virtual ResearchArticle RelatedArticle { get; set; } 
} 

我在哪裏把ForeignKeys/InverseProperties正確地涉及這些。因爲理想情況下,我將爲該網站的每個部分提供Executive內容,ResearchArtic內容等。 (我遵循已經在Data-First prj中已經制定的先例,我正在模擬這種方式,因爲這是我的做法,fyi。)

回答

0

實體框架需要類型標識符字段,當您將複合對象存儲在單桌;但是,您可以使用視圖輕鬆完成此操作。要使用視圖,請創建單個內容表和>基類<類。不要將TableAttribute數據註釋應用於基類。所有其他數據註釋都很好。

public class ContentBase 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ContentId { get; set; } 
    public string Content { get; set; } 
    ... 
} 

然後,您可以創建更接近地表示內容的派生類,並將TableAttribute數據註釋應用於這些派生類。例如,

[Table("ResearchArticleView")] 
public class ResearchArticle : ContentBase 
{ 
    ...you can add more properties here that are included in the view... 
    ...and not necessarily the underlying table, like from a joined table... 
    ...or just use the class as is, so that you have a better name... 
} 

要使用此,成立了一個觀點叫ResearchArticleView包括在基類中的列,以及任何你想要的計算或聯接的列,那麼DbSet添加到您的背景下,代表視圖。

我建議爲每種類型的內容都有內容表,然後使用我爲每種內容類型描述派生類型的方法。例如,創建研究文章的基礎和執行內容的基礎。因爲,當數據庫變得龐大而充滿內容時,擁有一個單一內容表可能會導致您備份和優化問題。

+0

我在www.crowdit.com上有一個這樣的工作示例。我創建了一個包含所有基本屬性的DreamBase類。然後,我創建了一個Dream類來表示實際的Dreams表。最後,我創建了一個從DreamBase派生並實現一些聚合屬性的DreamView對象。 DreamView代表我從Dreams表格創建的視圖,它包含一些彙總數據。這與你想要完成的工作非常相似,我想。 – Markus

+0

感謝您的回覆。你的方式是有道理的,而且是我最初做的。然而,我被告知要按照你描述的那樣做「單一方式」,所以這個答案對我沒有幫助。不過謝謝。我仍然需要回答我原來的問題。 –

+0

哦,我陷入了困境......我猜不太明白你的問題。那麼,你真正想要的是設置導航屬性?如果是這樣的話,你真的需要從Content對象導航到引用它的對象嗎? (您可以使導航屬性只朝一個方向。) – Markus

相關問題