1

我有这个实体:

public class Product
{
    public virtual long ID { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual ProductCategory Category { get; set; }
    public virtual byte[] Image { get; set; }
    public virtual string IsAvaliableToSell { get; set; }
    public virtual DateTime InsertDate { get; set; }
    public virtual DateTime UpdateDate { get; set; }
}

有了这个 Map 类:

public ProductMapping()
{
    [...]
    Map(model => model.Image, "fldProductImage")
        .Insert()
        .Update()
        .Nullable()
        .CustomType("Text");
    [...]
 }

当我尝试检索添加到数据库中的产品时,出现错误:

无法将“System.String”类型的对象转换为“System.Byte []”类型。

我认为它在我的 Image 属性中。有谁知道发生了什么?

4

2 回答 2

1

将TEXT字段类型更改为BYTEA类型解决了我的问题。

于 2013-04-23T18:29:51.820 回答
1

造成这种情况的可能解释是,该text类型有一些限制和要求,这些限制和要求没有被共享bytea

  • text无法存储空字节,因为系统使用以空字符结尾的字符串;如果您提交字节字符串abcd\x00efgh(其中\x00是空字节),数据库将存储abcd.

  • text要求数据在客户端的文本编码中有效。当从客户端发送到服务器时,数据被解释为在 client_encoding 中,并在需要时转换为服务器的文本编码。如果不需要转换,它仍然会被验证。

因此,如果您将一堆字节塞入文本字符串中,您将得到截断的乱码。如果您的客户端使用不同的编码,您可能还会因为编码转换问题而在获取数据时出错。

bytea不关心数据的编码是什么,因为它只是服务器的原始字节。不执行转换。因为它是以转义形式发送的,所以它可以包含空字节。您应该始终将二进制数据存储为bytea或使用大对象(请参阅lo扩展名)。唯一的另一种选择是将其存储为一些文本安全的表示形式,例如,但这在字段中base64很少需要。bytea

于 2013-04-23T23:52:18.947 回答