WedX - журнал о программировании и компьютерных науках

Как заставить NHibernate сериализовать данное свойство в двоичное поле?

У меня есть простое веб-приложение ASP.NET MVC, которое использует NHibernate с функцией автоматического сопоставления FluentNHibernate для доступа к данным. Я столкнулся со сценарием, в котором я хотел бы, чтобы NHibernate сохранял некоторые классы в виде двоичных данных.

Например, у меня есть что-то похожее на это:

public class User
{
    ...

    // This field will be persisted
    public virtual byte[] PortraitData { get; set; }

    // This method will get me what I'm actually interested in
    public virtual Image GetPortrait()
    {
        return SerializationHelper.Deserialize<Image>(PortraitData);
    }
}

(Я оставляю реализацию класса SerializationHelper на воображение читателя. Он не делает ничего сложного, просто сериализует и десериализует данные в байтовые массивы и обратно.)

Я хотел бы изменить приведенный выше код на это:

public class User
{
    ...

    public virtual Image Portrait { get; set; }
}

Итак, в основном я хочу сказать (Fluent)NHibernate, что он должен сохранять некоторые классы (указанные мной), сериализуя их в двоичное поле с именем фактического свойства.
(В приведенном выше случае я хотел бы, чтобы он сериализовать Image в поле varbinary с именем Portrait.)

Фактический сценарий, который у меня есть, немного сложнее, чем этот, но этот пример очень хорошо демонстрирует, чего я хочу достичь. (Значение: класс System.Drawing.Image — не единственный, сериализация которого меня интересует.)

Я знаю, что во Fluent или в самом NHibernate должна быть какая-то конфигурация, позволяющая сделать именно это, но я не мог этого понять. Не могли бы вы рассказать мне, как это сделать?

Заранее спасибо за помощь!


Ответы:


1

Ключом является реализация IUserType, которая, по сути, представляет собой интерфейс, который вы используете для перевода туда и обратно из типа POCO в тип SQL. Я использую его для перевода перечислений ‹-> пользовательских строковых значений в базе данных. Взгляните на код NHibernate для YesNoType, который переводит туда и обратно между истинными/ложными логическими типами POCO в типы SQL varchar "ДА"/"НЕТ".

Чтобы использовать это во Fluent NHibernate, вы можете вызвать метод .CustomType() в методе Map, где T — это класс, реализующий IUserType. Я думаю, вы могли бы создать соглашение, чтобы все свойства изображения использовали класс реализации, а не определяли его для каждого свойства отдельно, но я не знаком с этой частью Fluent NHibernate.

например Map(x => x.Portrait, "PORTRAIT_DATA").CustomType();

14.09.2010
  • Я нашел для этого ссылку Fluent: wiki.fluentnhibernate.org/ 14.09.2010

  • 2

    Вы должны реализовать IUserType.

    Тогда остается только сказать NH, чтобы она использовала его для этой собственности.

    В xml это type="QualifiedName"; ищите эквивалент FNH.

    14.09.2010
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]