Npgsql.PostgresException:列不能自动转换为类型bytea

时间:2018-09-23 04:07:42

标签: entity-framework npgsql ef-core-2.1

使用EF-Core for PostgresSQL,我有一个实体,其字段类型为byte,但决定将其更改为类型byte[]。但是当我进行迁移时,在应用生成的迁移文件时,它引发了以下异常:

  

Npgsql.PostgresException(0x80004005):42804:“徽标”列不能为   自动投射以键入bytea

我已经在互联网上搜索了解决方案,但是我看到的只是其他数据类型而不是字节数组的类似问题。请帮忙。

1 个答案:

答案 0 :(得分:0)

错误确切地说明了正在发生的事情...在某些情况下PostgreSQL允许更改列类型(例如int-> bigint),但是在许多情况下,这种更改是不重要的或可能具有破坏性的内容,它会拒绝自动这样做。在这种特定情况下,发生这种情况是因为Npgsql将您的CLR字节字段映射为PostgreSQL smallint(2字节字段),因为PostgreSQL缺少1字节数据字段。因此PostgreSQL拒绝将smallint转换为bytea,这是有道理的。

但是,您仍然可以通过自己编写从smallintbytea的数据转换来进行迁移。为此,请编辑生成的迁移,找到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);

如果您现有的列恰好包含一个以上的字节(对您来说不成问题),则应将其截断。显然,请仔细测试由此产生的数据。