使用EF-Core for PostgresSQL,我有一个实体,其字段类型为byte
,但决定将其更改为类型byte[]
。但是当我进行迁移时,在应用生成的迁移文件时,它引发了以下异常:
Npgsql.PostgresException(0x80004005):42804:“徽标”列不能为 自动投射以键入bytea
我已经在互联网上搜索了解决方案,但是我看到的只是其他数据类型而不是字节数组的类似问题。请帮忙。
答案 0 :(得分:0)
错误确切地说明了正在发生的事情...在某些情况下PostgreSQL允许更改列类型(例如int
-> bigint
),但是在许多情况下,这种更改是不重要的或可能具有破坏性的内容,它会拒绝自动这样做。在这种特定情况下,发生这种情况是因为Npgsql将您的CLR字节字段映射为PostgreSQL smallint
(2字节字段),因为PostgreSQL缺少1字节数据字段。因此PostgreSQL拒绝将smallint
转换为bytea
,这是有道理的。
但是,您仍然可以通过自己编写从smallint
到bytea
的数据转换来进行迁移。为此,请编辑生成的迁移,找到ALTER COLUMN ... ALTER TYPE
语句并添加一个USING
子句。 As the PostgreSQL docs say,这使您可以基于现有列(甚至其他列)为列提供新值。专门将int(或smallint)转换为bytea的方法如下:
ALTER TABLE tab ALTER COLUMN col TYPE BYTEA USING set_bytea(E'0', 0, col);
如果您现有的列恰好包含一个以上的字节(对您来说不成问题),则应将其截断。显然,请仔细测试由此产生的数据。