域驱动设计自动增量实体密钥

时间:2015-12-16 15:15:02

标签: entity domain-driven-design auto-increment

刚开始使用Domain Driven Design,我了解到你应该让你的模型保持有效状态,并且在创建类的新实例时,建议将所有必需的属性作为构造函数参数。

但是,当使用自动递增的键时,我从持久层调用Add方法时只有这个新ID。如果我在没有密钥的情况下实例化我的对象,我认为它们将处于无效状态,因为它们需要某种唯一标识符。

在创建实体的新实例之前,我应该如何实现我的架构以获取我的ID?

2 个答案:

答案 0 :(得分:6)

生成的随机ID

这里的实用方法是使用随机ID 并在实例化实体之前生成它们,例如在工厂。 GUID是一种常见的选择。

在您提出问题之前:No, you won't run out of GUIDs: - )

具有ID预留的顺序ID

如果由于某种原因必须使用顺序ID,那么您仍然可以选择:

  • 查询数据库上的序列以获取下一个ID。这取决于您的数据库产品,例如Oracle有它们。)
  • 使用自动增量键创建一个表,该表仅用作键保留表。要获取ID,请在该表中插入一行 - 现在为您保留生成的密钥,因此您可以将其用作实体的ID。

请注意,在您开始创建实体之前,顺序ID的两种方法都需要数据库往返。这就是随机ID通常更简单的原因。如果可以,请使用随机ID。

DB生成的ID

另一种可能性是,只是在创建时没有ID,但只有在DB上的插入操作成功时才​​会存​​在。根据我的经验,这使得实体创建难以使用,所以我避免使用它。但对于非常简单的情况,它可能是一种有效的方法。

答案 1 :(得分:0)

了解Dmi的评论

1)您可以在工厂方法中确保您的实体存储到数据库中。这可能适用于您的域,也可能不适用,但如果您确定要保存的实体可能是一种有效的方法

2)您可以将ID与数据库中的主键分开。我曾经处理过一个案例,如果客户付款,某些东西只是一个订单,那时它将通过它的发票ID(一个后续ID)来识别。这并不意味着在数据库中我需要一个列ID,它也是该对象的主键。你可以在数据库中有一个主键(随机guid),直到ID(int?)是连续的,如果尚未填充则为null。