如何使用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处理选项类型。

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