Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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# EFCore和C中骨料之间的DDD和参考#_C#_Entity Framework Core_Domain Driven Design - Fatal编程技术网

C# EFCore和C中骨料之间的DDD和参考#

C# EFCore和C中骨料之间的DDD和参考#,c#,entity-framework-core,domain-driven-design,C#,Entity Framework Core,Domain Driven Design,我有一个问题,我不知道如何解决时,假设DDD和使用C#/EF核心 简化情况:我们有两个集合-项目和仓库。它们中的每一个都通过ExternalId(Guid)来标识它的外部(FE等),这也被视为其域标识。它还具有数据库Id,用于在数据库模型中标识它-实体模型和数据库模型与EF Core是同一个类,允许使用私有字段-仅公开外部Id和必需字段。实体(在DDD和EF核心意义上)包含大量严格耦合到对象的业务逻辑和方法。一般来说,我遵循示例中的模式 项目分配给仓库,当创建项目时,我们需要将仓库传递给其构造函

我有一个问题,我不知道如何解决时,假设DDD和使用C#/EF核心

简化情况:我们有两个集合-项目和仓库。它们中的每一个都通过ExternalId(Guid)来标识它的外部(FE等),这也被视为其域标识。它还具有数据库Id,用于在数据库模型中标识它-实体模型和数据库模型与EF Core是同一个类,允许使用私有字段-仅公开外部Id和必需字段。实体(在DDD和EF核心意义上)包含大量严格耦合到对象的业务逻辑和方法。一般来说,我遵循示例中的模式

项目分配给仓库,当创建项目时,我们需要将仓库传递给其构造函数

将完整仓库对象传递给Item的构造函数(以及Item定义的其他方法)是否合适:

或者我应该只依赖数据库Id:

public Item(long warehouseId,..)
我对此有一个问题,因为我从一方面了解到聚合不应该引用其他聚合,但另一方面,使用Datbase DB将实现细节(关系数据库中的对象persistance)泄漏到域模型中,这在我看来是不应该发生的

使用外部ID:

public Item(Guid warehouseId,..)
无法解决此问题,因为数据库中的实际关系不基于此


你的意见是什么?我有点困惑。

通常您会为聚合根的Id创建一个值对象。依赖数据库生成的Id是一种可能性。如果您决定让Db生成Id,那么您需要使用它。 但是,无论如何,为什么您需要传递仓库引用或Id?看起来Item是一个实体,Warehouse是应该包含该实体的聚合根。通常,不应在聚合根之外创建实体


编辑:正如沃恩·弗农(Vaughn Vernon)在红皮书中所描述的那样,有几种身份创建策略。其中之一是让持久性机制(如SQL Db)生成实体或聚合的唯一标识符。

在分析过程中创建的域模型通常与在设计过程中创建的域模型不同。从语义上讲,它们都是相同的,您正在传递引用,但设计模型认识到您必须持久化数据,因此出于性能原因,您可能不想预加载所有引用的对象,无论这只是从同一域中的磁盘加载,或者从另一个域中的远程服务。

上面的图片只是简化了。它们都需要是聚合根。该项不需要指定仓库。@user1658223如果它们实际上都是聚合根,那么您可能只需要仓库ID,因为您在“事务边界”中有重叠的地方。AR应该只能通过自己的Id访问,并且不应该依赖构造函数中的其他aggregateRootId,因为这意味着只有在有仓库的情况下才能创建项。OK。忘记前面的例子吧。让我们假设仓库不是通过构造函数传递的,而是通过项的方法:AssignToWarehouse传递的。I pass Warehouse还是WarehouseId?AR总是通过Id引用其他AR。为什么?为什么直接引用它们有缺点?有时有两组模型很方便:域模型和持久模型:)
public Item(Guid warehouseId,..)