Как сопоставить размеченное объединение в стиле перечисления F # с postgres с помощью 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 -> Int без преобразования вручную?

person mamcx    schedule 13.12.2016    source источник
comment
Можете ли вы сделать таблицу PG также с полем ENUM? Получает ли Pg имя F# ENUM, т. е. P1, или числовое представление?   -  person Evan Carroll    schedule 14.12.2016
comment
Ваше определение типа не является перечислением, это размеченный союз   -  person John Palmer    schedule 14.12.2016
comment
@Evan Carroll использует числовое представление   -  person mamcx    schedule 14.12.2016


Ответы (1)


Я не эксперт F #, но если я правильно понимаю, ваш PriceTier - это размеченный союз, а не перечисление. Дискриминированные объединения могут содержать произвольные поля, поэтому они никоим образом не соответствуют перечислениям. Если ваш конкретный тип объединения действительно логически является перечислением, может иметь смысл определить его как тип перечисления, а не объединение (см. этот пост, например), и в этом случае вы можете использовать обычную функцию отображения перечисления Npgsql.

Обратите внимание, что я не уверен, что Npgsql может даже знать, что ваш тип является размеченным объединением - в конце концов, он кажется просто типом CLR, как и любой другой (хотя я могу ошибаться в этом).

person Shay Rojansky    schedule 14.12.2016