Npgsql.PostgresException: столбец не может быть автоматически приведен к типу bytea - PullRequest
0 голосов
/ 23 сентября 2018

Используя EF-Core для PostgresSQL, у меня есть объект с полем типа byte, но я решил изменить его на тип byte[].Но когда я выполняю миграцию, при применении сгенерированного файла миграции выдается следующее исключение:

Npgsql.PostgresException (0x80004005): 42804: столбец «Логотип» не может быть автоматически приведен к типу bytea

Я искал решение в Интернете, но все, что я видел, было схожие проблемы с другими типами данных, а не с байтовым массивом.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 23 сентября 2018

Ошибка говорит точно, что происходит ... В некоторых случаях PostgreSQL допускает изменения типа столбца (например, int -> bigint), но во многих случаях, когда такое изменение нетривиально или потенциально разрушительно,он отказывается делать это автоматически .В данном конкретном случае это происходит потому, что Npgsql отображает ваше байтовое поле CLR как PostgreSQL smallint (2-байтовое поле), поскольку в PostgreSQL отсутствует 1-байтовое поле данных.Поэтому PostgreSQL отказывается от приведения с smallint до bytea, что имеет смысл.

Однако вы все равно можете выполнить миграцию, написав преобразование данных самостоятельно, с smallint до bytea.Для этого отредактируйте сгенерированную миграцию, найдите оператор ALTER COLUMN ... ALTER TYPE и добавьте предложение USING. Как сказано в документации PostgreSQL , это позволяет вам указать новое значение для столбца на основе существующего столбца (или даже других столбцов).В частности, для преобразования int (или smallint) в байты используйте следующее:

ALTER TABLE tab ALTER COLUMN col TYPE BYTEA USING set_bytea(E'0', 0, col);

Если ваш существующий столбец содержит более одного байта (это не должно быть проблемой для вас), он долженукоротить.Тщательно проверьте данные, полученные из этого.

...