C# EF代码中的ICommantable接口优先-最佳实践

C# EF代码中的ICommantable接口优先-最佳实践,c#,interface,ef-code-first,C#,Interface,Ef Code First,假设我有多个不相关的对象(类),在这些对象(类)中我无法获取公共抽象类(因此所有此类类的主键都是唯一的)。我还想将公共对象列表应用于所有此类类(例如注释列表)。我的第一个方法是这样的: public class Comment { public int Id { get; set; } public string CommentContent { get; set; } public virtual ICommentable CommentableObject { ge

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

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; }
}
公共类注释
{
公共int Id{get;set;}
公共字符串内容{get;set;}
公共虚拟ICommentable可注释对象{get;set;}
}
公共接口可兼容
{
ICollection注释{get;set;}
}
公共类页面:ICommentable
{
公共int Id{get;set;}
公共字符串PageContent{get;set;}
公共虚拟ICollection注释{get;set;}
}
公共类职位:ICommentable
{
公共int Id{get;set;}
公共字符串后内容{get;set;}
公共虚拟ICollection注释{get;set;}
}
EF code首先做的是创建一个带有多个可空外键(每个相关类一个)的
注释
表:
Page\u Id
Post\u Id

一种替代方法是为每个类设置单独的注释表:
PageComments
PostComments


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

我们在这里讨论的是IsA(is-A,is-A)关系。您的选择如下:

它们本质上是将is-a继承/实现映射到is-a数据库关系的方法。第二个选项(每种类型的表)似乎以一种规范化的方式实现了这一点,这是我不熟悉的第三个选项


在您的情况下,如果您确定只有2个ICommentable类,那么您可能希望继续使用现有的类。如果您改变主意,认为它们都实现了相同的接口,这也会让您有更多的灵活性。规范化“直到它受伤,去规范化”直到它起作用。

我们这里讨论的是IsA(Is-A,Is-A)关系。您的选择如下:

它们本质上是将is-a继承/实现映射到is-a数据库关系的方法。第二个选项(每种类型的表)似乎以一种规范化的方式实现了这一点,这是我不熟悉的第三个选项


在您的情况下,如果您确定只有2个ICommentable类,那么您可能希望继续使用现有的类。如果您改变主意,认为它们都实现了相同的接口,这也会让您有更多的灵活性。规范化“直到它受伤,反规范化”直到它工作。

我必须有两个以上的ICommentantable类。正如我所提到的,我将不得不留下抽象类继承(“is-a”)来处理一些ICommentantable类上“更重要”的东西。我对第一种方法很满意,但不知何故,我不喜欢其中有多个可为null的FK键,特别是如果有8-10个ICommentable类(以及那个数量的可为null的FK)。我在考虑将新的列-唯一键(对所有ICommentable都是唯一的)应用于每个ICommentable类,但找不到类似的方法。我相信唯一键解决方案(他使用Owner)就是本文中每个类模型的表中所描述的。如果您看一下它(并花一点时间让它融入),它应该提供一些代码,使Linq到EF查询更容易一些。不要被页面底部的空值所愚弄,它们来自连接的查询。我必须有两个以上的ICommentable类。正如我所提到的,我将不得不留下抽象类继承(“is-a”)来处理一些ICommentantable类上“更重要”的东西。我对第一种方法很满意,但不知何故,我不喜欢其中有多个可为null的FK键,特别是如果有8-10个ICommentable类(以及那个数量的可为null的FK)。我在考虑将新的列-唯一键(对所有ICommentable都是唯一的)应用于每个ICommentable类,但找不到类似的方法。我相信唯一键解决方案(他使用Owner)就是本文中每个类模型的表中所描述的。如果您看一下它(并花一点时间让它融入),它应该提供一些代码,使Linq到EF查询更容易一些。不要被页面底部的空值所愚弄,它们来自连接的查询。