如何使用 npgsql 将 F# 枚举样式的可区分联合映射到 postgres

How to map a F# enum style discriminated union to postgres with npgsql

我在 PG 中有一个 table 字段需要存储在 1 到 5 之间。在 F# 端我有这个枚举:

type PriceTier =
    | P1
    | P2
    | P3
    | P4
    | P5

我直接使用 npgsql,没有类型提供程序或 ORM。当我发送带有参数的命令时:

    let build (row:CustomerRecord) =
        [P("@code", row.code);.... P("@defaultPrice", row.defaultPrice);....]

我收到错误:

The CLR type Models+PriceTier isn't supported by Npgsql or your PostgreSQL. If you wish to map it to a PostgreSQL composite type you need to register it before usage, please refer to the documentation.

所以我读了 http://www.npgsql.org/doc/types/enums_and_composites.html 并做了:

NpgsqlConnection.MapEnumGlobally<PriceTier>();

但这不起作用,因为该类型不是真正的枚举,而是 F# 类型。

所以,我有两个问题:

我不是 F# 专家,但如果我理解正确的话,您的 PriceTier 是一个有区别的联合,而不是一个枚举。可区分的联合可以包含任意字段,因此它们实际上不以任何方式对应于枚举。如果你的特定联合类型在逻辑上确实是一个枚举,那么将它实际定义为一个枚举类型而不是一个联合可能是有意义的(例如参见this post),在这种情况下你可以使用常规的 Npgsql 枚举映射功能。

请注意,我不确定 Npgsql 甚至可以知道您的类型是一个受歧视的联合 - 在一天结束时它似乎只是一个 CLR 类型,就像任何其他类型一样(虽然我对此可能是错误的).