Как заставить NHibernate сериализовать данное свойство в двоичное поле? - PullRequest
0 голосов
/ 14 сентября 2010

У меня есть простое веб-приложение 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; }
}

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 14 сентября 2010

Ключ является реализацией IUserType, который по сути является интерфейсом, который вы используете для перевода назад и вперед из типа POCO в тип SQL. Я использую его для перевода перечислений <-> пользовательских строковых значений в базу данных. Взгляните на код NHibernate для YesNoType, который переводит взад и вперед между типами POCO типа true / false и логическими типами SQL YAR типа YES / NO.

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

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

0 голосов
/ 14 сентября 2010

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

Тогда вам нужно просто указать NH использовать его для этого свойства.

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

...