如何使用Entity Framework Core处理F#Option类型?

问题描述

我将EF Core与F#一起使用,并且我有一个包含选项类型的实体/模型。但是,EF Core无法与F#Option<T>类型配合使用。我可以使用Nullable<T>,但是它在F#中不是很惯用,并且希望坚持使用Option类型。

我查看了 Value Converter ,但文档显示null无法使用Value Converter进行转换,此外,它在生成的SQL语句中不能很好地发挥作用,从而迫使客户端进行过滤而不是使用SQL子句。

namespace Db

open Microsoft.EntityFrameworkCore

open System

[<CLIMutable>]
type Invitation =
    { Id: Guid
      Code: string

      // HOW TO HANDLE OPTION TYPE
      FirstName: string option
      LastName: string option
      Email: string
      GeneratedAt: DateTime }

[<CLIMutable>]
type User =
    { Id: Guid
      FirstName: string
      LastName: string
      Email: string
      Password: string
      PasswordSalt: string
      PasswordHash: string }


type AppContext(opts) =
    inherit DbContext(opts)

    [<DefaultValue>]
    val mutable private invitation: DbSet<Invitation>

    member x.Invitation
        with get() = x.invitation
        and set v = x.invitation <- v


    [<DefaultValue>]
    val mutable private user: DbSet<User>

    member x.User
        with get() = x.user
        and set v = x.user <- v


    override _.OnConfiguring (options: DbContextOptionsBuilder) =
        options.UseSnakeCaseNamingConvention()
        |> ignore

在生成带有可选值的模型时,有什么办法可以解决这个问题?

解决方法

您可以使用EFCore.FSharp中的value converter处理选项类型。

尽管它似乎不适用于导航属性和外键。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...