实体框架代码优先 - 继承 - 相关项集合

时间:2015-08-12 06:46:55

标签: c# entity-framework ef-code-first table-per-class

我正在尝试使用继承

在EF6中实现模型

我有以下课程:
基地
评论
页:基地 BlogPost:Base

Page和BlogPost都以相同的方式使用评论。所以我将Base定义为

public class Base
{
    public int ID { get; set; }
    // ...
    public ICollection<Comment> Comments { get; set; }
}

评论类定义如下:

public class Comment
{
    public int ID { get; set; }
    public int RelatedItemID { get; set; } // points to Base::ID
    public string Text { get; set; }
}

假设我想将数据库设置为&#34;每个类型的表&#34;,所以每个页面和BlogPost都有自动增量int PK。

现在EF知道Comment.RelatedItemID指向哪个表?即Page或BlogPost

实现此的最佳方法是什么,而不必诉诸于&#34;每个层次结构表&#34;

1 个答案:

答案 0 :(得分:2)

  

我想将数据库设置为“每个类型的表”,所以有   Page和BlogPost的各个表都有自动增量int   PK

这是一个问题。
的描述看起来像 TPC,但由于您希望为每个后代使用自动增量主键,因此它不适合TPC,因为最终您将在一个中复制主键实体集。显然,它也不是TPT,因为TPT假设有一个带有自动增量ID的“基础”表,而“派生”表具有非自动增量主键,同时是“基础”表的外键。

在我看来,逻辑上这些实体并不相关。我的意思是,当你想要使用单个查询查询页面和博客帖子时,没有任何情况。因此,最好避免在EF模型中继承。

我建议你这样重新设计模型:

// "abstract" tells EF, that this type doesn't require mapping
public abstract class CommentBase
{
    public int ID { get; set; }
    public int RelatedItemID { get; set; }
    public string Text { get; set; }
}

public class PageComment: CommentBase {}
public class BlogPostComment :  CommentBase {}

public abstract Base<TComment>
    where TComment : Comment
{
    public int ID { get; set; }
    // ...
    public ICollection<TComment> Comments { get; set; }
}

public class Page : Base<PageComment> { /* other page properties */ }
public class BlogPost : Base<BlogPostComment> { /* other blog post properties */ }

代码中仍然存在继承,但EF模型中将有两个不同的实体集。 OTOH,你会得到两个带注释的单独表格 - 一个用于页面,一个用于博客帖子。