【问题标题】:Entity design when principal entity state is an aggregate of its dependant entities当主体实体状态是其依赖实体的集合时的实体设计
【发布时间】:2021-04-10 15:22:44
【问题描述】:

让我们将Term 定义为主体实体,将Course 定义为一对多的依赖关系。

public class Term 
{
    public int Id { get; set; }
    public List<Course> Courses { get; set; } = new List<Course>();
}

public class Course 
{
   public int Id { get; set; }
   public DateTime EndDate { get; set; }
}

Term 实体的一个常见查询条件是检查是否所有课程都已完成,据此我们认为 Term 也已完成,并且这种隐式状态可以在很多方面表现出来我们的业务逻辑中的位置、填充视图模型的简单查询等。

使用像 EntityFramework Core 这样的 ORM,这个查询可以在很多地方弹出。

Terms.Where(t=>t.Courses.All(c=>c.EndTime > DateTime.Now))
Terms.Count(t=>t.Courses.All(c=>c.EndTime > DateTime.Now))

想到的其他示例包括产品及其当前库存计数、仅包含未经确认的 cmets 的帖子等。

如果我们要捕获这些隐式状态并让它们在我们的主体实体中直接访问,而不需要从数据库中重新水化我们的依赖实体,我们认为最佳实践是什么?

想到的一些解决方案:

  1. 使用计算列执行子查询并将其映射到主体实体上的属性,例如Term.IsFinished

  2. 在我们的实体上定义一个普通属性,并使用调度解决方案在预定时间戳上更新其值,这在很多情况下是不可接受的,因为不同间隔的不一致,或者使用域事件并对它们做出反应来更新属性在主体上

【问题讨论】:

    标签: c# entity-framework domain-driven-design


    【解决方案1】:

    创建一个视图,其中两个表按主体实体连接和聚合。

    直接在实体框架中使用视图而不是基表。


    奖励积分:

    在 SQL Server 中,您可以在视图上创建聚集索引,它会自动为您维护。 Oracle 也有类似的概念。

    在其他 RDBMS 中,您需要创建一个单独的表,并使用触发器自己维护它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 2018-08-08
      • 2019-12-05
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多