将 F# 类型保存到数据库
Saving F# types to a database
A lot of f# articles recommend 使用 fsharp 的内置类型(如可区分的联合、元组和记录)对域进行建模。一旦我们有了这个模型,如何将它持久化到数据库中呢?
Entity framework 和类型提供程序仅适用于具有可变属性的标准 类。
您可以将 [<CLIMutable>]
属性放在记录上:
[<CLIMutable>]
type Foo = { Bar : string; Baz : int }
当通过 IL、C# 或 Visual Basic 查看时,这会将其变成具有可变属性的 class。从 F# 看,它仍然像一个不可变的记录。
不过,这并没有真正解决问题,因为没有用于(反)序列化歧视联合的相应功能。
(作为附带说明,IIRC,JSON.net 支持 F# 记录和可区分联合,但到目前为止,这是我所知道的唯一例外。)
在我看来,这是因祸得福,因为域模型应该与持久性细节分离。
在 C# 中,您可能认为像 Entity Framework 这样的 ORM 提供了这种解耦,但事实并非如此。即使使用所谓的代码优先 POCO 实体,您最终仍然会创建一个 关系 模型,而不是一个面向对象的模型。想想 'navigation properties',它们是纯粹的关系问题。在 OOD 中,此类属性违反了 law of Demeter(我们称它们为 Train Wrecks)。
如果你想让域模型与实现细节分离,你需要先创建模型,然后想办法在之后持久化它。如何做到这一点取决于所使用的持久性技术。
A lot of f# articles recommend 使用 fsharp 的内置类型(如可区分的联合、元组和记录)对域进行建模。一旦我们有了这个模型,如何将它持久化到数据库中呢?
Entity framework 和类型提供程序仅适用于具有可变属性的标准 类。
您可以将 [<CLIMutable>]
属性放在记录上:
[<CLIMutable>]
type Foo = { Bar : string; Baz : int }
当通过 IL、C# 或 Visual Basic 查看时,这会将其变成具有可变属性的 class。从 F# 看,它仍然像一个不可变的记录。
不过,这并没有真正解决问题,因为没有用于(反)序列化歧视联合的相应功能。
(作为附带说明,IIRC,JSON.net 支持 F# 记录和可区分联合,但到目前为止,这是我所知道的唯一例外。)
在我看来,这是因祸得福,因为域模型应该与持久性细节分离。
在 C# 中,您可能认为像 Entity Framework 这样的 ORM 提供了这种解耦,但事实并非如此。即使使用所谓的代码优先 POCO 实体,您最终仍然会创建一个 关系 模型,而不是一个面向对象的模型。想想 'navigation properties',它们是纯粹的关系问题。在 OOD 中,此类属性违反了 law of Demeter(我们称它们为 Train Wrecks)。
如果你想让域模型与实现细节分离,你需要先创建模型,然后想办法在之后持久化它。如何做到这一点取决于所使用的持久性技术。