将 F# 类型保存到数据库

2024-05-18

A lot http://gorodinski.com/blog/2013/02/17/domain-driven-design-with-fsharp-and-eventstore/f# 文章数推荐 http://fsharpforfunandprofit.com/posts/no-uml-diagrams/使用 fsharp 的内置类型(例如可区分联合、元组和记录)来对域进行建模。一旦我们有了这个模型,如何将其保存到数据库中?

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


你可以把[<CLIMutable>]记录上的属性:

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

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

但这并不能真正解决问题,因为没有用于(反)序列化受歧视联合的相应功能。

(顺便说一句,IIRC、JSON.net 支持 F# 记录和可区分联合,但到目前为止,这是我知道的唯一例外。)

在我看来,这是一个因祸得福, 因为领域模型应该与持久性细节解耦.

在 C# 中,你可以think像实体框架这样的 ORM 提供了这种解耦,但事实并非如此。即使使用所谓的代码优先 POCO 实体,您最终仍然会创建一个关系型的模型,而不是面向对象的模型。想想“导航属性”,它们纯粹是关系问题。在 OOD 中,此类属性违反了得墨忒耳定律 https://en.wikipedia.org/wiki/Law_of_Demeter(我们称他们为火车残骸).

如果您想让域模型与实现细节分离,您需要首先创建模型,然后找到一种方法来持久化它。如何做到这一点取决于所使用的持久性技术。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 F# 类型保存到数据库 的相关文章

  • 如何使用 Entity Framework Core 保存字符串列表?

    假设我们有一个如下所示的类 public class Entity public IList
  • Entity Framework 6 Code First 迁移 - 用于生产的多个分支

    在我的项目中 我们有一个分支模型 它有一个单独的开发分支 并且每个版本都有一个单独的分支 它可能看起来像这样 dev master r1 r2 因此 我们在 dev 上开发并将其合并到 master 然后创建一个发布分支 r1 r2 我们想
  • EF 5.0 中的链接 OR 条件

    我将以此为序言 我正在积极寻找这个问题的解决方案 但我想 如果堆栈上有人已经解决了这个问题 我可能会缩短一些研究和开发时间 我在网上没有找到任何东西 所以这里是 我们正在构建的应用程序框架中有一个案例 我们需要能够接受一组谓词 List
  • 实体框架代码优先查找与 SingleOrDefault(预加载)

    我正在使用 Entity Framework 4 2 代码优先 来访问我的数据库 我假设如果我使用查询一个实体SingleOrDefault如果实体尚未被跟踪 它只会查询数据库 但情况似乎并非如此 这Find另一方面 方法似乎确实在这样做
  • 如何从 C# 可移植类库 (PCL) 添加对 F# 可移植库的引用

    我有一个项目 其中包含两个 F 项目和一个 C 项目 我想在其中编写一些 XUnit 测试 FS PL F 3 1 3 3 1 0 可移植库 FS PL Legacy F 31 2 3 5 1 可移植库 旧版 测试 C NET 4 5 Wi
  • 地图中的一组键

    我有一个地图 X 我试图获取一组满足特定条件的键 如下所示 Map Keys X gt Set filter fun x gt 但我找不到从 F 的 Map 集合中获取密钥的方法 转换你的map http msdn microsoft co
  • 基于函数签名的模式匹配

    在 F 中 您可以对函数签名进行模式匹配 我想用一个函数来装饰多个函数 该函数测量函数的执行情况并调用 statsd 我当前的功能是 let WrapFunctionWithPrefix metrics Metric Client IRec
  • F# 使用 while 循环

    我有一个数据读取器 我想从中返回行集合 在阅读了一天的书籍后 我无法找到在 f 中执行此操作的最佳方法 我可以在 F 中以正常的 C 方式进行操作 但这不是我使用 f 的原因 这就是我想要实现的目标 let values while rea
  • 如何在 F# 中进行卷积?

    我想convolve http en wikipedia org wiki Convolution具有离散滤波器的离散信号 信号和滤波器是 F 中的浮点数序列 我能弄清楚如何做到这一点的唯一方法是使用两个嵌套的 for 循环和一个可变数组来
  • 如何从 C# 调用 F# 类型扩展(静态成员函数)

    FSharp 代码的结构如下 我无法控制源代码 namespace FS
  • 合并具有公共字段的列表的最快方法?

    我正在学习 F 并且正在做赔率比较服务 ala www bestbetting com 以将理论付诸实践 到目前为止 我有以下数据结构 type price Bookie string Odds float32 type selection
  • 从函数返回随机值是副作用吗?

    我当时正在编写一些 F 代码 并且正在编写一个从一组字符串中返回随机字符串的函数 假设我有这样的事情 open System let a a b c d let rstring arr string let r new Random arr
  • 使用 FParsec 解析 int 或 float

    我正在尝试使用 FParsec 解析文件 该文件由 float 或 int 值组成 我面临两个问题 无法找到好的解决方案 1 Both pint32 and pfloat将成功解析相同的字符串 但给出不同的答案 例如pint32将返回3解析
  • 使用 System.Text.Json 序列化记录成员

    我在记录中使用自我引用成员 如下所示 type Payload Id Guid member x DerivedProperty Derived Property using id x Id NewtonSoft Json会序列化这个 但是
  • 合并两个 linq 表达式

    我有两个在不同时间构建的表达式 但需要合并才能获得 where 子句的准确 分组 我确实尝试过this https stackoverflow com questions 10390784 how do i combine expressi
  • 实体框架:数据库上下文可以在不同模式之间拥有外键吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们有一个具有多个模式的数据库 公司架构师希望每个架构都有实体框架 DbContext 此外 不同模式之间还存在外键关系 今天在搭建架
  • 在构建过程中引用自身内部的记录

    我正在尝试创建一条记录 该记录在同一构造函数中使用先前定义的字段之一来计算另一个字段的值 例如 myRecordType Foo int Bar int myRecord Foo 5 Bar Array init Foo fun i gt
  • 如何根据表名在 DbContext 中选择正确的 DbSet

    假设我有一个包含以下 DbSet 的 DbContext class Amimals DbContext public DbSet
  • 将数据库优先迁移到代码优先 - 从发布切换到迁移

    我们需要将现有项目从数据库优先迁移到代码优先 每个环境 DEV TEST PROD 的数据库版本略有不同 差异在于 DEV 中的更改可能尚未推送到 TEST 和 PROD 我们使用实体框架 6 1 3 我们有一个数据库项目部署数据库 发布操
  • 如何在种子实体框架版本 6.x 中通过 AddOrUpdate 方法插入身份[重复]

    这个问题在这里已经有答案了 我有一个具有身份列的实体 作为数据种子的一部分 我想对系统中的 标准数据 使用特定的标识符值 我不想禁用身份 只有我想在迁移种子中设置 IDENTITY INSERT ON 我的代码是 protected ove

随机推荐