2016-12-13 6 views
2

でpostgresにするために労働組合を判別し、私はF#の側では1〜5の間を格納する必要がありますフィールドを持つPG内のテーブルを持っている私は、この列挙を持っている:がNpgsqlの

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

IタイププロバイダやORMなしでnpgsqlを直接使用しています。私はパラメータを指定してコマンドを送信する場合:

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

私はエラーを取得:タイプではないので

NpgsqlConnection.MapEnumGlobally<PriceTier>(); 

しかし、これは動作しません:

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を読んでみませんか真の列挙型ですが、F#型です。だから、

、私はここで2つの質問があります。

  • 列挙型に変換せずにそのままであるF#型を使用することは可能ですか? >のIntせずに手動で変換を行う -
  • はPriceTier間をマッピングすることは可能ですか?
+1

PGテーブルをENUMフィールドでも作成できますか? PgはENUM ie、P1のF#名を取得していますか、それとも数値表現を取得していますか? –

+2

あなたの型定義はenumではありません。差別化された組合 –

+0

@Evan Carrollは数値表現を使用しています – mamcx

答えて

2

私はF#エキスパートではありませんが、私が正しく理解していれば、PriceTierは列挙型ではなく弁別された組合です。差別化された共用体には任意のフィールドが含まれる可能性があるため、実際には列挙型に対応していません。特定の労働組合の種類が論理的に、本当に列挙型である場合、それはあなたが定期的にNpgsqlの列挙型のマッピング機能を使用することができ、その場合には、(例えばthis postを参照)、実際に列挙型としてではなく、労働組合として定義しても意味があります。

Npgsqlは、あなたの型が差別化された共用体であることを知ることさえできないことに注意してください。 - それはちょうど他のものと同様のCLR型のようです(私はそれについて間違っているかもしれません) 。