Отображение Nhibernate System.Drawing.Image - PullRequest
4 голосов
/ 05 октября 2010

Вопрос: я получаю исключение, сериализующее этот класс в файл nHibernate xml ({"Не удалось определить тип для: System.Drawing.Image, System.Drawing, для столбцов: NHibernate.Mapping.Column (Settings)"}) .

Как сопоставить 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

Ответы [ 3 ]

9 голосов
/ 05 октября 2010

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

Вместо этого сопоставьте с byte[] с помощью varbinary типа sql и , которым вы выполняете преобразование из и в Image при необходимости. Пример .

Также стоит проверить, является ли этот проект о поддержке хранилища больших объектов для NHibernate , кажется более эффективным, чем отображение на byte[], и это такжеотличная статья обо всех вариантах.

3 голосов
/ 05 октября 2010

Вы должны использовать IUserType. См. Этот пример, включая сопоставления

0 голосов
/ 05 октября 2010

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

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

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

...