我想将所有网站内容存储在一个中央内容表中,但将其与网站的每个部分相关联。类似的东西:
......等等。 我无法理解整个代码的第一种方法,因为它涉及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。)
答案 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添加到表示视图的上下文中。
我建议为每种类型的内容提供内容表,然后使用我为每种内容类型描述的派生类型的方法。例如,为研究文章和执行内容的基础创建基础。因为,当您的数据库变得庞大且内容丰富时,拥有一个单一内容表可能会导致备份和优化问题。