【发布时间】: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 的帖子等。
如果我们要捕获这些隐式状态并让它们在我们的主体实体中直接访问,而不需要从数据库中重新水化我们的依赖实体,我们认为最佳实践是什么?
想到的一些解决方案:
-
使用计算列执行子查询并将其映射到主体实体上的属性,例如
Term.IsFinished -
在我们的实体上定义一个普通属性,并使用调度解决方案在预定时间戳上更新其值,这在很多情况下是不可接受的,因为不同间隔的不一致,或者使用域事件并对它们做出反应来更新属性在主体上
【问题讨论】:
标签: c# entity-framework domain-driven-design