2012-12-29 59 views
2

我按照一个示例应用程序一个数据库第一方法。 POCO类是通过t4模板生成的,它将具有从数据库中携带的标识属性。对于一些类,我在域实体使用,该ID的类型可以整型,字符串&的Guid身份冲突库

我没有看到是字符串或GUID,我可以在域产生并传递到存储库ID的问题。在int的情况下,我也可以做到这一点,但我想利用SQL数据库的AUTOINCREMENT选项。

我的问题是:

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

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

回答

2

谁的责任是产生实体身份。它是 域或存储库?

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

如何存储库和 域之间进行身份的同步?

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

+0

要评论您的第一个答案,我从未遇到过用户喜欢的问题域,“我想要一串长长的随机但唯一的字符,以便我可以识别每个[实体]。”我的观点是Guids不需要在域中定义。如果跨越多个服务器或某种特性需要同步需求,则将域实体包装在处理此问题的基础结构对象中会更好。 但是,道具给你第二个问题的答案。说得好。我会高兴的。 –

+0

用户通常根本不关心ID,关于Guid的好处是它可以由调用客户端提供,在这种情况下,它不需要等待来自服务器的响应来知道ID创建的实体。这在CQRS方案中很有用。另一个优点是在服务器提供ID的情况下,不需要等待数据库响应来知道该ID。无论哪种方式,身份证是一个技术问题。 – eulerfx

+0

我同意这个ID是一个技术问题,那么为什么污染你的领域模型(这应该是独立于技术问题的),其ID不遵循你的无处不在的语言?如果没有这种不必要的烟雾,您提供的两个示例都可以轻松解决。 –