Ошибка говорит точно, что происходит ... В некоторых случаях 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);
Если ваш существующий столбец содержит более одного байта (это не должно быть проблемой для вас), он долженукоротить.Тщательно проверьте данные, полученные из этого.