EF Code First中的ICommentable界面 - 最佳实践

时间:2015-09-08 18:50:00

标签: c# interface ef-code-first

假设我有多个不相关的对象(类),我无法获得公共抽象类(因此所有这些类的唯一主键)。我还想将公共对象列表应用于所有这些类(例如,注释列表)。我的第一种方法是这样的:

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_IdPost_Id

其中一个选择是为每个班级设置单独的评论表:PageCommentsPostComments

对于这种常见情况,还有其他更优雅的解决方案吗?上面两种选择中哪一种更好?

1 个答案:

答案 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个可提交的课程,您可能希望坚持使用您所拥有的课程。如果您改变主意,同时实现相同的界面,这也将使您更灵活。规范化直到它受到伤害,反规范化直到它起作用。