将F#类型保存到数据库

时间:2015-08-08 10:44:35

标签: entity-framework f# domain-driven-design

使用fsharp内置类型的f#文章lotrecommend,例如区分联合,元组和记录来建模域。一旦我们有了这个模型,它如何被持久化到数据库?

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

1 个答案:

答案 0 :(得分:11)

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

[<CLIMutable>]
type Foo = { Bar : string; Baz : int }

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

但这并没有真正解决问题,因为(de)序列化歧视联盟没有相应的功能。

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

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

在C#中,您可能认为像实体框架这样的ORM提供了这样的解耦,但它并没有。即使使用所谓的代码优先POCO实体,您仍然最终会创建一个关系模型,而不是面向对象的模型。想想导航属性&#39;这是纯粹的关系问题。在OOD中,此类属性违反了law of Demeter(我们称之为 Train Wrecks )。

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