Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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/8/design-patterns/2.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# 域实体-自动ID?_C#_Design Patterns_Domain Driven Design_Repository Pattern - Fatal编程技术网

C# 域实体-自动ID?

C# 域实体-自动ID?,c#,design-patterns,domain-driven-design,repository-pattern,C#,Design Patterns,Domain Driven Design,Repository Pattern,域实体总是唯一的,因此需要一个跨域的唯一标识符。一种常见的方法是用一个id装饰一个域实体,并将其留给底层体系结构技术来设置该id public MyDomainEntity { int Id { get; set; } } 通常,域实体存储在能够自动增加ID的数据库中。或者我们使用允许生成ID(UUID等)的ORM映射器 然而,我发现这种方法很有问题。谁保证数据库能够生成id?谁来确保自动id符合域的要求 如果我想指定如何使实体成为唯一的,以及如何生成新的ID,我应该在哪里实现这一

域实体总是唯一的,因此需要一个跨域的唯一标识符。一种常见的方法是用一个id装饰一个域实体,并将其留给底层体系结构技术来设置该id

public MyDomainEntity {  
    int Id { get; set; }
}
通常,域实体存储在能够自动增加ID的数据库中。或者我们使用允许生成ID(UUID等)的ORM映射器

然而,我发现这种方法很有问题。谁保证数据库能够生成id?谁来确保自动id符合域的要求


如果我想指定如何使实体成为唯一的,以及如何生成新的ID,我应该在哪里实现这一点?关于存储库实现?在UnitOfWorks上?

由于id是技术性的东西,所以域对id生成不应有任何要求


如果您想控制id生成,那么我认为存储库将是最好的地方。

id是技术性的吗?假设我是一名政府官员,我为司机发放车牌号码。车牌号码需要自动生成(除了驾驶员希望获得某个号码,但这是另一回事),而且它们总是唯一的,因此从技术上讲,它们是一个id,但是一个域的一个要求。仅仅因为某些东西是唯一的,它不会自动成为id。更重要的是,作为id,它需要是一个实体的id。让我们称之为政府和车主之间的合同,该合同具有一个名为“licensePlateNumber”的属性。这不是自动的id。id将是合同的id,车牌号只是一个属性。如果你这样看,你是正确的。但是,我们还有一个问题,即许可证号码应该是唯一的。如果某个东西可以是唯一的,则取决于技术实现。例如,EntityFramework不允许“唯一”,因此使属性唯一的唯一方法是将其视为键。因此,我需要将我的实体id设置为车牌号,以确保它在表中保持唯一性。我会接受你的建议并在存储库中处理它,这听起来是一个合理的建议。我建议在存储库中生成id是为了一个技术id。在我看来,id应该是技术性的,因此它是在存储库这样的技术组件中创建的。但是,当您拥有一个在域世界中具有意义的自然id时,则必须在域层中创建该id。毕竟,创建它需要域逻辑。