如何使用npgsql将F#enum样式区分联合映射到postgres

时间:2016-12-13 21:12:56

标签: postgresql f# npgsql

我在PG中有一个表,需要存储1到5之间的字段。在F#方面我有这个枚举:

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

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

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

我收到错误:

  

CLR类型Models + PriceTier不受Npgsql或您的支持   PostgreSQL的。如果你想将它映射到PostgreSQL复合类型你   需要在使用前注册,请参阅文档。

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

NpgsqlConnection.MapEnumGlobally<PriceTier>();

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

所以,我在这里有2个问题:

  • 是否可以按原样使用F#类型而不转换为枚举?
  • 可以在PriceTier - &gt;之间进行映射。 Int没有手动进行转换?

1 个答案:

答案 0 :(得分:2)

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

请注意,我不确定Npgsql甚至可以知道你的类型是一个有区别的联合 - 在一天结束时,它似乎只是一个CLR类型,就像其他任何一样(尽管我可能错了)。