f# - 将数据库记录建模为类型

标签 f#

我正在用 F# 重写一个 C# 库,其中大多数类与数据库表(类似于 ActiveRecord)一对一映射。我正在考虑是否使用记录或类(甚至可能是 DU?)。在属性 setter 中有相当数量的验证来维护不变量。在 F# 中建模的最佳方法是什么?我不希望将违反业务逻辑的对象持久化到数据库中。欢迎任何想法。

一些额外的想法......
将不变量移动到外部“ Controller ”类是否更好?来自 C# 允许与数据库记录对应的对象包含无法保存到数据库的任何内容,这感觉是错误的。我想是因为早点失败似乎比晚点失败要好。

最佳答案

通过将方法附加到记录,您可以将数据保存在记录中,并且仍然使用数据类型保留验证逻辑:

type Person =
    { First : string;
      Last  : string; } with
    member x.IsValid () =
        let hasValue = System.String.IsNullOrEmpty >> not    
        hasValue x.First && hasValue x.Last

let jeff = { First = "Jeff"; Last = "Goldblum" }
let jerry = { jeff with First = "Jerry" }
let broken = { jerry with Last = "" }

let valid = [jeff; jerry; broken] 
            |> List.filter (fun x -> x.IsValid())

记录的复制语义几乎和设置属性一样方便。验证不会发生在属性集上,但很容易将记录列表过滤为仅有效的记录。

关于f# - 将数据库记录建模为类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2089707/

相关文章:

f# - 如何从序列的迭代中提前返回?

f# - F# 中的非类型化/类型化代码引用与宏卫生之间是否存在关系?

F# 类型提供程序 - 嵌套属性实例化

.net - F#中的异步等待

c# - 如何在 F# 中创建通用 C# 类型的实例?

asynchronous - 异步方法中的类型不匹配

VS 构建工具 2019 16.6.0 中的 F# 损坏

F# 交换数据数组并获得正确的结果

arrays - 如何分配 RAM 容纳不下的单个数组

F# 优先级队列