2010-10-05 119 views
4

問題:我得到一個異常序列化這個類到一個nHibernate的XML文件({「無法確定類型爲:System.Drawing.Image,System.Drawing,爲列:NHibernate.Mapping .COLUMN(設置)「})。Nhibernate映射的System.Drawing.Image

如何將System.Drawing.Image映射到nHibernate? 什麼MS-SQL dbtype將被使用?

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace nhDBapi.Tables 
{ 

    [NHibernate.Mapping.Attributes.Class(Name = "nhDBapi.Tables.clsSettings, nhDBapi", Table = "lsSettings")] 
    public class clsSettings 
    { 

     [NHibernate.Mapping.Attributes.Id(Name = "Settings", Column = "Settings", TypeType = typeof(System.Drawing.Image))] 
     public System.Drawing.Image Settings; 

    } // End partial class lsSettings 


} // End Namespace nhDBapi.Tables 
+0

刪除已經有答案的問題並不酷: http://stackoverflow.com/questions/3913875/nhibernate-detachedquery-equivalent-for-hql你浪費人們的時間... – 2010-10-12 21:33:41

+0

我只是刪除了一個沒有用的答案的問題。它不工作k與非var數據類型,這就是它的全部。我不打算使用var。我想要編譯時類型檢查。 – 2010-10-12 22:56:11

+0

'var'是編譯時檢查的。這不是一個數據類型。這只是一個關鍵字。 Mauricio的回答對我來說似乎很好。 – 2011-04-26 06:02:12

回答

9

我不建議直接映射到System.Drawing.Image。它不僅是一次性的(NHibernate將不得不部署它,我也不確定它是否可以),但是如果你獲取了一個clsSettings的集合,你將會創建大量的Image實例,因此如果你不願意的話會浪費CPU和內存,不要使用它們。

相反,映射到一個byte[]與SQL類型varbinary和句柄轉換和圖像的必要。 Example

另外值得一提的是這個項目約large object storage support for NHibernate,似乎比映射到byte[]更有效率,它也是一個關於所有選項的優秀文章。

0

您主張將數據存儲在數據庫中,因爲巨大的開銷,這不是一個好主意。你有這樣做的好理由嗎?這是一個Web應用程序或客戶端桌面應用程序?

遠更好的解決方案是將圖像存儲在文件系統中,並使用數據庫來存儲有關的圖像元數據,如文件名,標題等

但隨着毛雅伯說,如果你必須做那麼你可能最好使用byte []數組,或者使用封裝byte []數組的一些自定義類型,併爲您提供幫助方法,如public Image GetBitmapImage();

+1

我通常也建議將圖像存儲在文件系統中,但一切都有其優點和缺點,請參閱http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay。而SQL Server 2008有這樣的AFAIK是一個很大的改進的文件流類型。 – 2010-10-05 15:44:13