我正在尝试使用继承
在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;
答案 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,你会得到两个带注释的单独表格 - 一个用于页面,一个用于博客帖子。