Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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,我开始了一个新项目(重写现有的解决方案),并希望使用和探索DDD。在设计领域模型的过程中,一开始很难忽略实体框架。它对于只有小的子集合或仅基于CRUD的较小集合非常有效。现在我到了一个地步,我有一个集合了大量收藏的集合,我对此非常着迷 域概览 在我的域模型中,有一个名为的协议(聚合根) 协议的子项称为协议条目 协议条目具有特定类型(默认、每月和每年)。就目前而言,除了知道它们是什么类型之外,没有其他要求了——它们都是相同的,行为相同,但可能有不同的类型(请继续阅读以了解原因) 现在,在这个月内

我开始了一个新项目(重写现有的解决方案),并希望使用和探索DDD。在设计领域模型的过程中,一开始很难忽略实体框架。它对于只有小的子集合或仅基于CRUD的较小集合非常有效。现在我到了一个地步,我有一个集合了大量收藏的集合,我对此非常着迷

域概览

  • 在我的域模型中,有一个名为的协议(聚合根)
  • 协议的子项称为协议条目
  • 协议条目具有特定类型(默认、每月和每年)。就目前而言,除了知道它们是什么类型之外,没有其他要求了——它们都是相同的,行为相同,但可能有不同的类型(请继续阅读以了解原因)
  • 现在,在这个月内,有几个协议条目添加到特定的协议中(类型:默认值)。无法设置或定义协议条目的日期(时间)——它是用“现在”添加/创建的
  • 在每个月底(12月除外,见下一页),要求在再次添加任何其他协议条目之前,创建/添加协议条目(类型:每月)
  • 在每年的年底,有一项要求,即创建/添加一个协议条目(类型:年度),然后再添加任何其他协议条目。年底时,不需要每月输入,因为已经有了年度输入
这可能看起来很糟糕,但最终可能看起来是一个非常简单的问题。除了我想实现的以下目标之外,这是/曾经是。我不知道,如果我在重新考虑持久性/性能,而在域设计过程中我不应该这么多,那么事件也找不到任何相关的答案。或者我的朋友,这是无法解决的

更多信息

由于每月和每年的协议条目都是从系统本身(后台作业/服务)创建的,因此用户不会关心这一点。在新的月/年开始的00:00添加协议条目时,可能会出现短暂错误,因为后台作业/服务尚未完成当前协议的月度或年度条目-正常

旧解决方案中的协议条目有两个字段,分别称为nextMonthyEntry和NextYearlyEntry(数据类型:DateTime)。有了这些,询问诸如“protocol.IsYearlyOverdue()”之类的聚合问题是很容易的,而且感觉很自然。在后台作业/服务期间,它还可以帮助查询所有“过期”的协议,并处理每月或每年的条目。我在新的解决方案中重用了这些字段

因为协议在一个月内可以有数千个协议条目,在一年内甚至更多,所以我无法在每次加载协议时加载聚合根中的所有条目,这似乎是正常的(我在其他一些帖子中读到了这一点)只要协议对这些没有要求(例如,如果不要求客户一次只能有5个订单,则客户AR不能一直拥有所有订单)

问题

怎么可能不在每个协议中加载所有条目,并保持检查是否允许将条目添加到协议(我确信它与协议相关)的行为,因为它必须更新协议的(行)版本以及下一个(每月|每年)版本添加条目以确保一致性并注意并发问题时的条目字段

当myProtocol获取一个名为AddedEntries的私有字段时,该字段将填充新条目。因为条目从不被编辑/删除,所以它可以只跟踪这些条目。因此,我可以添加一个或多个条目,确保一致性并验证规则。从域和DDD的角度来看,这似乎很好,但现在在持久化方面,如何将这些新条目添加到数据库中?我不能仅仅用集合更新协议,因为这将删除不在集合(EF)中的现有条目。如果存在条目,是否由存储库(ProtocolRepository.Update(protocol))负责向依赖表中添加条目


很抱歉问了这么长的问题,这可能不是一个完美的标题(我不知道如何用几句话来概括)。我是DDD的新手,这个问题让我发疯,如果不是所有的事情都是完全正确的,我也很抱歉——我还在学习。提前感谢大家花时间关心和思考我的问题

如果你想与很多孩子一起工作,请查看沃恩·弗农的工作,尤其是他在日历和日历条目方面的工作。它是Java语言,但看起来与您非常相似:

请注意关系是如何建立的,Calendar从不拥有任何CalendarEntry,而是CalendarEntry引用CalendarId

当您处理日历或CalendarEntry时,应用程序服务负责加载要处理的集合、使对象交互并持久化它们。这样,您就可以更好地控制粒度,如果您只需要当前月份的条目子集,就不需要加载完整的聚合,从而提高性能和内存占用

请记住DDD是关于定制的

因此,在存储库中,您可能有以下方法:

  • 当前月份的(负载)入口
  • 下个月的(装载)进料口