将F#类型保存到数据库

Kur*_*ren 5 f# domain-driven-design entity-framework

一个很多 F#的文章推荐使用内建类型fsharp的如识别联合,元组和记录的域模型.一旦我们有了这个模型,它如何被持久化到数据库?

实体框架和类型提供程序仅适用于具有可变属性的标准类.

Mar*_*ann 13

您可以将该[<CLIMutable>]属性放在记录上:

[<CLIMutable>]
type Foo = { Bar : string; Baz : int }
Run Code Online (Sandbox Code Playgroud)

当通过IL或C#或Visual Basic查看时,这将把它变成具有可变属性的类.从F#看,它仍然看起来像一个不可变的记录.

然而,这并没有真正解决这个问题,因为(de)序列化判别联盟没有相应的功能.

(作为旁注,IIRC,JSON.net支持F#记录和受歧视的联盟,但到目前为止,这是我所知道的唯一例外.)

在我看来,这是一种伪装祝福,因为域模型应该与持久性细节分离.

在C#中,您可能认为像实体框架这样的ORM提供了这样的解耦,但事实并非如此.即使使用所谓的代码优先POCO实体,您仍然最终创建关系模型,而不是面向对象的模型.想想"导航属性",这纯属关系问题.在OOD中,这些属性违反了得墨忒耳法则(我们称之为" 火车残骸").

如果要保持域模型与实现细节分离,则需要先创建模型,然后找出一种方法,以便在之后保留它.如何做到这一点取决于使用的持久性技术.

  • +1000"这是伪装的祝福,因为域模型应该与持久性细节分离." (5认同)