EF6 Code First:如何集中我网站的不同部分的内容?

时间:2015-04-15 15:23:21

标签: entity-framework-6.1

我想将所有网站内容存储在一个中央内容表中,但将其与网站的每个部分相关联。类似的东西:

  • 内容(对于实际内容字节[]和所有部分使用的基本信息)
  • ResearchArticleContent(基本上具有内容表中的相关ContentId和特定于ResearchArticles的信息的额外cols)
  • ResearchArticle
  • ExecutiveContent(基本上具有Content表中的相关ContentID和针对Executives的特定数据的额外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以正确关联它们。因为理想情况下,我会为网站的每个部分提供Executivecontent,ResearchArticlecontent等。 (我遵循已经在我模仿的Data-First prj中已经列出的先例,所以这就是我这样做的方式,fyi。)

1 个答案:

答案 0 :(得分: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添加到表示视图的上下文中。

我建议为每种类型的内容提供内容表,然后使用我为每种内容类型描述的派生类型的方法。例如,为研究文章和执行内容的基础创建基础。因为,当您的数据库变得庞大且内容丰富时,拥有一个单一内容表可能会导致备份和优化问题。