2010-10-05 90 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