2010-10-05 6 views
4

Вопрос: Я получаю исключение, сериализующее этот класс в XML-файл nHibernate ({«Не удалось определить тип для: System.Drawing.Image, System.Drawing для столбцов: NHibernate.Mapping .Column (Настройки) "}).Nhibernate mapping of 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 вы тратите время людей ... –

+0

Я просто удалил вопрос, который не имел полезного ответа. k с невариантным типом данных, вот и все. И я не намерен использовать var. Я хочу, чтобы проверка типа во время компиляции. –

+0

'var' проверяется временем компиляции. Это не тип данных. Это просто ключевое слово. Ответ Маурисио кажется мне хорошим. –

ответ

9

Я бы не рекомендовал сопоставлять непосредственно с System.Drawing.Image. Он не только одноразовый (NHibernate должен будет утилизировать его, и я не уверен, что он может), но и если вы получите коллекцию clsSettings, вы будете создавать множество экземпляров изображений, тем самым теряя процессор и память, t использовать их все.

Вместо этого перейдите на страницу byte[] с использованием varbinary sql и вы ручка конвертирования из и в изображение при необходимости. Example.

Также стоит проверить этот проект около large object storage support for NHibernate, кажется более эффективным, чем сопоставление с byte[], и это также отличная статья обо всех вариантах.

0

Вы защищаете хранение изображения в базе данных, это редко бывает хорошей идеей из-за огромных накладных расходов. У вас есть веская причина для этого? Это веб-приложение или клиентское настольное приложение?

Гораздо лучше подходит для хранения изображения в файловой системе и использовать базу данных для хранения мета-данные об изображении, например, имя файла, заголовок и т.д.

Но Маурисио Схеффер говорит, если вы должны сделать это, вероятно, вам лучше использовать массив byte [], или, может быть, использовать какой-то пользовательский тип, который инкапсулирует массив byte [] и дает вам вспомогательные методы, такие как public Image GetBitmapImage();

+1

Я также обычно рекомендую хранить изображения в файловой системе, но все имеет свои плюсы и минусы, см. Http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay. И SQL Server 2008 имеет тип фильтра, который AFAIK является большим улучшением. –