2

我在示例应用程序中遵循数据库优先方法。POCO 类是通过 t4 模板生成的,它将具有它从数据库中携带的 Identity 属性。对于我在域中用作实体的某些类,id 的类型可以是int、string 和 Guid

我没有看到我可以在域中生成并将其传递给存储库的字符串或 Guid 的问题。在 int 的情况下,我也可以这样做,但我想利用SQL Database 的 AUTOINCREMENT 选项

我的问题是:

  1. 谁的责任是为实体生成身份。它是域还是存储库?

  2. 如何在存储库和域之间完成身份同步?例如,我可以为域中的客户创建一个 1000 的 id,并要求存储库保存它。当存储库保存它时,新标识可能是 2000(AUTOINCREMENT 选项设置新标识)。现在这两个实体是不同的,如果域中的 Customer 实体(假设它被缓存以供将来操作)与Department等其他实体一起使用,则可能会导致域中的问题。id 为 1000 的域中的缓存实体 ( Customer ) 将作为新实体保存在 SQL 数据存储中。存储库不知道客户是缓存的还是新的。

4

1 回答 1

2

谁的责任是为实体生成身份。它是域还是存储库?

实体的身份可以由域直接分配或通过客户端请求分配。这种类型的身份通常是用一个Guid或另一个普遍唯一的值生成的。身份也可以由存储库分配以反映数据库生成的身份,例如增量身份列。

如何在存储库和域之间完成身份同步?

当实体的身份来自数据库生成的身份列时,域不应分配自己的身份。具有完整身份的临时实体最初将具有身份值 0。当临时实体成为持久实体时,存储库将分配身份值。那时,正如您所指出的,由于身份值已更改,因此新持久实体实例的缓存实例可能存在一些问题。有几种方法可以解决这些问题,但我尽量避免首先引用缓存(或其他任何地方)中的瞬态实体。这可以通过确保一个实体在持久化之前不会在很多地方被引用来更容易地完成。如果你最终在不同的地方引用了一个瞬态实体实例,你可以确保它的 . NET 运行时标识在实例的生命周期内保持不变。为此,您必须通过比较实体object.ReferenceEqualsGetHashCode在身份值检查之前,您必须在对象生命周期内缓存通过生成的哈希码。

于 2012-12-29T15:15:37.837 回答