2016-12-13 42 views
2

我在PG与字段的表需要1之间存储5.在F#方Postgres的我有这样的枚举:如何绘制F#枚举风格区分联合与Npgsql的

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#类型。

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

  • 可以使用F#类型,是无须转换为一个枚举?
  • 是否可以在PriceTier - > Int之间进行映射,而无需手动进行转换?
+1

你可以使PG表也ENUM字段? Pg是获取ENUM的F#名称,即P1,还是获得数字表示? –

+2

你的类型定义不是一个枚举,它是一个歧视的工会 –

+0

@Evan Carroll正在使用数字表示 – mamcx

回答

2

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

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