C# Nhibernate System.Drawing.Image的映射

C# Nhibernate System.Drawing.Image的映射,c#,sql,vb.net,nhibernate,nhibernate-mapping,C#,Sql,Vb.net,Nhibernate,Nhibernate Mapping,问题:将此类序列化为nHibernate xml文件时出现异常({“无法确定:System.Drawing.Image,System.Drawing,for columns:nHibernate.Mapping.Column(设置)”的类型) 如何将System.Drawing.Image映射到nHibernate? 要使用什么MS-SQL数据库类型 using System; using System.Collections.Generic; using System.Text; names

问题:将此类序列化为nHibernate xml文件时出现异常({“无法确定:System.Drawing.Image,System.Drawing,for columns:nHibernate.Mapping.Column(设置)”的类型)

如何将System.Drawing.Image映射到nHibernate? 要使用什么MS-SQL数据库类型

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

您必须使用IUserType。
我不建议直接映射到System.Drawing.Image。它不仅是一次性的(NHibernate将不得不处理它,我不确定它是否可以),而且如果您获取
clsSettings
的集合,您将创建大量映像实例,因此如果您不全部使用它们,将浪费CPU和内存

相反,使用sql类型varbinary映射到
字节[]
,并根据需要处理从图像到图像的转换


同样值得一看的是这个项目,它似乎比映射到
字节[]
更有效,而且它也是一篇关于所有选项的优秀文章。

您提倡在数据库中存储图像,但由于开销巨大,这很少是一个好主意。你这样做有充分的理由吗?这是web应用程序还是客户端桌面应用程序

更好的解决方案是将图像存储在文件系统中,并使用数据库存储有关图像的元数据,如文件名、标题等


但正如Mauricio Scheffer所说,如果必须这样做,那么最好使用byte[]数组,或者使用一些自定义类型来封装byte[]数组,并为您提供辅助方法,例如
public Image GetBitmapImage()

我通常也建议将图像存储在文件系统中,但每件事都有其优缺点,请参阅。SQL Server 2008具有filestream类型,AFAIK对此有很大改进。删除已经有答案的问题并不酷:你浪费了人们的时间……我只是删除了一个没有有用答案的问题。它不适用于非var数据类型,仅此而已。我不打算使用var。我需要编译时类型检查。
var
是编译时检查的。它不是数据类型。这只是一个关键词。毛里西奥的回答在我看来很好。