2016-07-03 3 views
0

Я обновляю приложение от Npgsql 2.2 до Npgsql 3.1. Он использует много перечислений и у меня есть много ошибок, как это:Может ли Npgsql 3.1 автоматически конвертировать между перечислениями PostgreSQL и текстом, например, Npgsql 2.2?

Npgsql.PostgresException : 42804: column "my_column" is of type my_enum but expression is of type text 

Это, кажется, происходит даже с простым INSERT, как этого

INSERT INTO my_table (col1, col2, col3, ...) SELECT $1, $2, $3, ... RETURNING 1 AS _row_affected

Каждое значение столбца добавляется в качестве параметра с помощью NpgsqlCommand.Parameters.AddWithValue(name, value) (без указания типа). Тип .NET в этом случае равен string.

В Npgsql 2.2 это сработало, потому что оно прозрачно преобразует текст в перечисления Postgres и наоборот. Есть ли способ получить такое же поведение в версии 3.1? Я знаю, что теперь он обрабатывает перечисления изначально, что может быть полезно, но действительно действительно упростит обновление, если бы я мог снова использовать перечисления, работающие как текст!

+0

Не могли бы вы разместить какой-нибудь код, чтобы показать, чего именно вы пытаетесь достичь? Npgsql 3.1 позволяет вам прозрачно читать перечисления как строки, но может быть что-то необработанное ... –

+0

Я на самом деле пытаюсь вставить в этом случае, а не читать. Я добавил очень упрощенную версию. Реальный код намного сложнее, поэтому может быть и больше, о чем я не знаю. – EM0

ответ

1

При создании параметра попробуйте настроить его NpgsqlDbType на Unknown, это должно сделать PostgreSQL прозрачным преобразованием текстового значения в перечисление.

+0

Спасибо, это работает для перечислений. Я столкнулся с той же ошибкой с доменом ('DOMAIN time_type AS time without time zone'), а' Unknown' не помог. Когда я пытался указать тип как «Время», он, казалось, ожидал TimeSpan. Любой простой способ заставить Postgres преобразовать мои строки времени (например, «12:34») в нужный тип? – EM0

+0

Я не уверен, что понимаю ... Настройка «NpgsqlDbType.Unknown» должна позволять отправлять текстовое представление для любого типа, если PostgreSQL может вывести этот тип из контекста запроса. Может быть, открыть еще один вопрос с полной информацией ... –