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

Entity framework 如何实现不同类型的类:继承、接口或类属性?,entity-framework,oop,inheritance,interface,domain-driven-design,Entity Framework,Oop,Inheritance,Interface,Domain Driven Design,我需要实施以下内容,但我不是舒尔,最好的方法是什么: 我正在为MVC应用程序创建消息功能 有两种类型的消息: 公共信息 私人信息 唯一的区别是公共消息有一个ValidFrom和validToDate字段。我尝试了以下方法: 方法1,接口 IMessage接口。实现接口的两个类PrivateMessage和PublicMessage。PublicMessage具有两个额外属性。使用实体框架将其映射到两个不同的表 方法2,继承 创建包含所有字段的消息基类。创建两个继承基类的类。可以将消息类映射到db

我需要实施以下内容,但我不是舒尔,最好的方法是什么:

我正在为MVC应用程序创建消息功能

有两种类型的消息:

  • 公共信息
  • 私人信息
  • 唯一的区别是公共消息有一个ValidFrom和validToDate字段。我尝试了以下方法:

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

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

    方法3,枚举属性以设置消息的类型

        public enum MessageType
        {
            Public = 1,
            Private = 2,
        }
    
    我只有一个消息类,但是添加了一个字段来显示它是什么类型的消息。可以轻松映射到一个表,并且可以轻松搜索“Public”类型的消息。我必须在枚举周围做一个小包装,因为EF不会在db中为它创建一个字段

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

    有没有正确的方法


    我首先使用实体框架代码4.3。

    您可以通过多种方式实现这一点,就像您正在试验的那样。所以

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

    使用哪一个的问题更多的是关于您试图解决的业务问题。您提到搜索两个表是低效的。因此,我假设您有一个视图来构建一个人可以同时看到私人和公共消息的视图。如果可以,最好在出现性能问题(以及支持性能问题的数据)后进行优化

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


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

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

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


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

    谢谢,关于第一种方法。您会使用两个类继承的接口吗。您知道如何将其映射到EF中的同一个表(设置modelBuilder.Entity().ToTable(“消息”);modelBuilder.Entity().ToTable(“消息”)是否足够?事实上,我认为您不需要接口,您可以有两个类,即PublicMessage和PrivateMessage,这两个类都是从一个BaseMessage继承而来的。我不是EF专家,但这里有一篇文章可以帮助您:感谢您的链接。非常有用。最后一个问题,您是将所有字段都包含在BaseMessage类中还是仅包含公共字段?请参阅ms odd希望PrivateMessage类上有属性,但它不使用这些属性,因此我倾向于只使用公共字段。BaseMessage应该只包含公共字段Hi,关于查询,你是对的,这不是最大的问题。考虑到这一点,有几种情况下两个表会更快,但一个查询“显示未读消息”与StackOverflow中的“显示未读消息”有点相同……关于生命周期,你是对的。公共消息有一个定义的持续时间,所以我觉得它属于两类。我将尝试让ORM以最佳方式映射它,而不是让它支配我如何构建域模型。