3

我已经成为 F# 中强大的类型系统以及它如何允许您对域模型创建一些非常严格的限制的忠实粉丝(感兴趣的人,请参阅this)。我也成为了 RavenDB 的忠实粉丝,以及在我遇到的大多数情况下它如何使数据库工作变得非常简单。然而,让两者很好地结合在一起似乎存在问题——至少如果你坚持不可变类型的话。

只要您不必更新实体,您需要做的就是使id属性可变。虽然我当然不高兴这是必要的,但我可以忍受它。但是,更改跟踪的处理方式似乎是,您必须改变从数据库中检索到的原始对象,并且不可能将新对象附加到数据库以表示现有实体的更新版本。使用修补 API 似乎可以做我想做的事,但文档明确警告不要使用这种类型的一般用法。

我是否遗漏了 RavenDB API 的一部分,它可以让我毫不费力地做到这一点,或者我必须放弃不可变域模型的想法(或者可能为它提出功能请求)?

4

1 回答 1

4

在这种情况下,不可变的问题在于您实际上正在处理可变数据。文档正在变异。您不在用户空间中对其进行变异的事实在这里无关紧要。您可以Advanced.Evict做的是将对&的调用包装Store在一个StoreUpdated或类似的扩展方法中。但我会质疑使用不可变数据来表示可变状态。

于 2013-09-30T06:46:12.567 回答