2013-04-23 27 views
1

我有這樣的實體:錯誤的文本字段(PostgreSQL的) - NHibernate的看不懂

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; } 
} 

有了這個地圖類:

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

當我試圖找回我的產品加入到數據庫,我得到一個錯誤:

Unable to cast object of type 'System.String' to type 'System.Byte []'.

我認爲這是在我的圖像屬性。有誰知道發生了什麼?

+0

爲什麼使用byte []存儲'Text'類型?沒有很多PostgreSQL的經驗,但對我來說這似乎很奇怪。 – 2013-04-23 17:40:41

+0

你的'Image'存儲在數據庫的'text'列中?爲什麼要使用'bytea'作爲二進制數據? – 2013-04-23 18:16:41

+0

謝謝,@ muistooshort,bytea類型解決了我的問題! – Kiwanax 2013-04-23 18:29:12

回答

1

本作的原因可能的解釋是,text類型有一些限制和要求的不是bytea共享:

  • text無法存儲空字節,因爲該系統採用空值終止串;如果提交字節字符串abcd\x00efgh(其中\x00是空字節),DB將存儲abcd

  • text要求數據在客戶端的文本編碼中有效。當從客戶端發送到服務器時,數據被解釋爲處於client_encoding中,並在需要時轉換爲服務器的文本編碼。如果不需要轉換,它仍然有效。

所以,如果你發送一串卡在文本字符串中的字節,你會得到截斷格式的亂碼。如果您的客戶端使用不同的編碼,則由於編碼轉換問題,您可能還會收到獲取數據的錯誤。

bytea不關心數據的編碼是什麼,因爲它只是服務器的原始字節。沒有轉換被執行。因爲它以轉義形式發送,所以它可以包含空字節。您應該始終將二進制數據存儲爲bytea或使用大對象(請參閱lo擴展名)。唯一的另一種選擇是將其轉換成一些文本安全表示,如base64,但這在bytea字段中很少需要。

1

更改TEXT域類型爲BYTEA型解決我的問題。