如何实现不同类型的类:继承,接口或类属性?

时间:2012-02-18 23:11:28

标签: entity-framework oop inheritance interface domain-driven-design

我需要实现以下内容,但我不知道最好的方法是什么:

我正在为MVC应用创建一个消息功能。

有两种类型的消息:

  1. 公开信息
  2. 私信
  3. 唯一的区别是公共消息具有ValidFrom和ValidTo日期字段。我尝试过以下方法:

    方法1,界面 IMessage界面。实现接口的两个类PrivateMessage和PublicMessage。 PublicMessage有两个额外的属性。使用实体框架将其映射到两个不同的表。

    方法2,继承 创建包含所有字段的消息基类。创建两个继承基类的类。可以将消息类映射到db,因此我只有一个表来保存记录。我似乎无法使用EF Code First映射接口。

    方法3,Enum属性设置消息的类型

        public enum MessageType
        {
            Public = 1,
            Private = 2,
        }
    

    我只有一个Message Class,但添加一个字段来显示它是什么类型的消息。轻松映射到一个表,并轻松搜索“公共”类型的消息。我必须围绕枚举制作一个迷你包装因为EF不会在数据库中为它创建一个字段。

    两个属性字段真的足以证明两个不同的类是正确的吗?在两个数据库表中搜索未读消息有点无效?

    有没有正确的方法呢?

    我使用Entity Framework Code First 4.3。

2 个答案:

答案 0 :(得分:2)

ORM框架通常以三种方式解决继承问题: 1.所有对象的一个​​表:在这种方法中有一个表,每个具体类将使用相同的表。将使用鉴别器来找出哪个记录​​与哪个类相关。 2.每个具体对象的一个​​表:对于每个具体对象,数据库中将有一个对应的表,每个对象都有自己的映射。框架不知道这些对象是继承层次结构的一部分。(没有鉴别器是需要) 3.每个对象的一个​​表(具体或抽象):在这种方法中,共享数据存储在一个映射到基本抽象类的表中,每个具体对象将有一个存储自己数据的分离表,并且存在一对一的关系在这个表和它的父表之间。在父表中需要一个鉴别器来显示哪个记录属于哪个对象的框架。

在第一种方法中,表的数量是最小的(只有一个表),但它具有所有对象的所有字段。因此,所有不常见的字段都应该可以为空并且可以为空。 第二个共享数据分布在许多表中,但每个表都控制着自己的字段,因此不需要有一些不必要的空值。 第三种方法将共享数据存储在一个地方的表数量最多,而且整个地方都没有不必要的空值。

根据你的场景,似乎第一种方法是最好的,因为两个对象之间的差异非常小(只有两个字段)并且在表中有一些空值是可以容忍的,并且它比有两个或三个表更好你的数据库,

答案 1 :(得分:1)

你可以通过多种方式完成这项任务,因为您似乎正在尝试。所以......

1)您可以拥有1个包含所有字段的实体Message和一个额外的列IsPublic 2)您可以在2个表中保留2个实体PublicMessagePrivateMessage 3)您可以拥有TPT或TPH继承模型,其中Message作为基类PublicMessagePrivateMessage

使用哪个问题更多的是关于您尝试解决的业务问题。你提到搜索两个表是低效的。所以,我假设你有一个观点来建立一个人可以看到私人和公共消息的地方。如果可以,最好在遇到性能问题后进行优化(以及支持它的数据)。

有趣的是,公共消息具有到期日期。这表明两个实体的生命周期不同。这可能表明它们需要单独管理。

有了所有这些假设,我会选择简单并让它们分开实体。对未读消息进行两次查询并不是世界末日。