假设我有多个不相关的对象(类),我无法获得公共抽象类(因此所有这些类的唯一主键)。我还想将公共对象列表应用于所有这些类(例如,注释列表)。我的第一种方法是这样的:
public class Comment
{
public int Id { get; set; }
public string CommentContent { get; set; }
public virtual ICommentable CommentableObject { get; set; }
}
public interface ICommentable
{
ICollection<Comment> Comments { get; set; }
}
public class Page : ICommentable
{
public int Id { get; set; }
public string PageContent { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
}
public class Post : ICommentable
{
public int Id { get; set; }
public string PostContent { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
}
EF代码首先做的是创建单个Comments
表,其中包含多个可为空的外键(每个相关类一个):Page_Id
,Post_Id
。
其中一个选择是为每个班级设置单独的评论表:PageComments
,PostComments
。
对于这种常见情况,还有其他更优雅的解决方案吗?上面两种选择中哪一种更好?
答案 0 :(得分:0)
我们在这里谈论的是IsA(Is-A,Is A)关系。您的选择位于:http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph
它们本质上是将is-a继承/实现映射到is-a数据库关系的方式。第二种选择(每种类型的表格)似乎以规范化的方式进行,第三种选择我不熟悉。
在您的情况下,如果您确定只有2个可提交的课程,您可能希望坚持使用您所拥有的课程。如果您改变主意,同时实现相同的界面,这也将使您更灵活。规范化直到它受到伤害,反规范化直到它起作用。