是否有可能在不放弃不变性的情况下更新RavenDB中的F#实体?

是否有可能在不放弃不变性的情况下更新RavenDB中的F#实体?,f#,ravendb,immutability,F#,Ravendb,Immutability,我非常喜欢F#中强大的类型系统,以及它如何允许您在域模型上创建一些非常严格的限制(对于感兴趣的人,请参阅)。我也成为了RavenDB的超级粉丝,在我遇到的大多数情况下,它是如何使数据库工作非常简单的。然而,要使这两种类型很好地结合起来似乎存在一些问题——至少如果您坚持使用不可变类型的话 只要不必更新实体,您所需要做的就是使id属性可变。虽然我当然不高兴这是必要的,但我可以接受。但是,处理更改跟踪的方式似乎是,您必须改变从数据库检索到的原始对象,并且不可能将新对象附加到数据库以表示现有实体的更新版

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

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


我是否错过了RavenDB API的一部分,该部分可以让我轻松完成这项工作,还是我必须放弃不可变域模型的想法(或者可能对其提出功能要求)?

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

我当然明白你的意思,但在实践中我不同意的原因有很多。首先,当使用F#记录类型时,必须在每个字段之前添加“可变”才能为原本非常简洁的模型定义添加大量噪声。除此之外,我喜欢在传递域模型时将其视为不可变的对象,因为对于非特定组件来说,能够更改它们是没有意义的。这种变化是非常明确的业务逻辑的一部分,它迫使您在更新模型时直接考虑持久性。但这绝对是一种由F#心态驱动的观点。如果这是一个C#项目,那么在这种情况下,我不会对可变性有任何问题。