Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 主体实体状态是其从属实体的集合时的实体设计_C#_Entity Framework_Domain Driven Design - Fatal编程技术网

C# 主体实体状态是其从属实体的集合时的实体设计

C# 主体实体状态是其从属实体的集合时的实体设计,c#,entity-framework,domain-driven-design,C#,Entity Framework,Domain Driven Design,让我们将术语定义为主要实体,将课程定义为一对多依赖关系 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

让我们将
术语
定义为主要实体,将
课程
定义为一对多依赖关系

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.IsFinished

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


  • 创建一个视图,每个主体实体连接并聚合两个表

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


    奖励积分:

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

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

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