【问题标题】:Domain Driven Design Auto Incremented Entity Key领域驱动设计自动增量实体键
【发布时间】:2015-12-16 15:15:02
【问题描述】:

刚从领域驱动设计开始,我了解到您应该使模型保持有效状态,并且在创建类的新实例时,建议将所有必需的属性作为构造函数参数。

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

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

【问题讨论】:

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


【解决方案1】:

生成的随机 ID

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

在你问之前:No, you won't run out of GUIDs :-)

具有 ID 保留的顺序 ID

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

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

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

DB 生成的 ID

另一种可能性是忍受这样一个事实,即您在创建时没有 ID,但只有当数据库上的插入操作成功时。以我的经验,这使得实体创建难以使用,所以我避免使用它。但对于非常简单的情况,这可能是一种有效的方法。

【讨论】:

  • 使用 DB 生成的 ID 方法,在插入实体之前,我的实体键为 0(如果使用整数 ID)。这意味着如果我添加一堆这样的实体,所有实体的键都是 0。这不违反 DDD 的原则,即每个实体都必须是唯一的吗?
【解决方案2】:

除了 theDmi 的 cmets

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

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

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2015-04-22
    • 2011-01-05
    • 2010-10-05
    相关资源
    最近更新 更多