2016-12-13 44 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類型,就像任何其他(我可能是錯誤的,雖然) 。