Как я могу сделать так, чтобы NHibernate узнал о первоклассном нулевом объекте без сохранения базы данных?

Я хотел бы использовать шаблон Null Object в моем домене, но я не хочу, чтобы в моей базе данных были записи, относящиеся к нему - я бы предпочел, если бы NHibernate смог сопоставить нулевое значение SQL с моим Null-объектом. , и наоборот.

Возможно ли это (с использованием Fluent NHibernate для сопоставлений)

P.S. Кажется, это довольно распространенная проблема, которую люди хотят решить, но мне интересно, почему я изо всех сил пытался найти ответ.

Изменить: Судя по этой записи в блоге, это не похоже на прямую возможность: NHibernate и шаблон нулевого объекта: параметры


person Chris Haines    schedule 03.07.2009    source источник


Ответы (3)


В нестандартном nhibernate вы можете использовать отображение импорта, которое не будет сохраняться в базе данных, как это;

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
      namespace="MyProject.MiddleTier"    
      assembly="MyProject.MiddleTier">
   <import class="ThingNotToPersist"/>
</hibernate-mapping>

Не знаю, как это работает бегло, но, надеюсь, это даст вам начало.

person Mark Dickinson    schedule 03.07.2009
comment
Спасибо, я не совсем уверен, как применить это к шаблону нулевого объекта. - person Chris Haines; 03.07.2009
comment
Хм, извините, я не применяю этот шаблон в своей работе. Я использую эту технику с ICriteria, чтобы получить последний объект из коллекции. В запросе к сопоставленному постоянному объекту я использую Projection, чтобы получить последний объект, затем я использую Treansformer для преобразования моего постоянного объекта в сопоставленный непостоянный эквивалент. Я не могу вдаваться в подробности, но помощь, которую я получил для этого, была здесь, я отправлю ссылку, когда найду ее. - person Mark Dickinson; 03.07.2009
comment
Вот stackoverflow.com/questions/747382 / - person Mark Dickinson; 03.07.2009

Ответ ... вы не можете. Орен говорит: «Концепцию NULL в NHibernate нельзя легко изменить, и для этого она не проходит через перехватчик. Вы можете использовать нулевые объекты для типов значений (используя UserType), но не для сущностей ".

person Chris Haines    schedule 30.07.2009

Хорошо, так как этот вопрос был опубликован, NHibernate 3 был выпущен - может быть, теперь что-то возможно?

Я не хочу отказываться от этого - я хочу использовать шаблон нулевого объекта, и я не собираюсь останавливаться на достигнутом, поэтому давайте подумаем о способах достижения этого!

Одна идея, с которой я столкнулся в нескольких сообщениях и заметках в Интернете, - это использовать два свойства - одно с общедоступным (без сопоставления) и одно с частным (сопоставленным) доступом, поэтому get-accessor для общедоступного свойства будет чем-то вроде return MyPrivate ?? MyType.NullObject ... Я исключил эту идею, потому что она создает проблемы с интерфейсом запросов - вы не можете запрашивать общедоступное свойство, потому что оно не отображается. Так что мы можем забыть об этом подходе.

У меня есть две идеи, которые я нигде не видел:

Используйте перехватчик, чтобы изменить значение свойства до / после чтения / записи.

Кто-то упомянул, что перехватчик не сработает, но потерпите меня ... в псевдокоде:

class Foo
{
    public Bar Bar { get; set; }
}

class Bar
{
    public static Bar None;
}

class MyInterceptor
{
    public void AfterLoad(IEntity object)
    {
        foreach (property in object)
            if (property.type == typeof(Bar) && property.value == null)
                object[property].value = Bar.None;
    }

    public void BeforeSave(IEntity object)
    {
        foreach (property in object)
            if (property.type == typeof(Bar) && property.value == Bar.None)
                object[property].value = null;
    }

    public void AfterSave(IEntity object)
    {
        foreach (property in object)
            if (property.type == typeof(Bar) && property.value == null)
                object[property].value = Bar.None;
    }
}

Короче говоря, замените пустые значения на нулевой объект при загрузке; перед сохранением замените нулевой объект фактическим нулевым значением, а после сохранения подставьте обратно нулевой объект.

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

Расширьте свой тип до выделенного типа нулевого объекта и сделайте его непостоянным. Как-нибудь.

Просто подумайте - предположим, вы расширили свой тип до выделенного типа нулевого объекта. Что-то вроде:

class Bar
{
    public static NullBar; // instace of NullBar
}

class NullBar : Bar
{
    // ...
}

Теперь, когда NullBar является выделенным типом, расширяющим Bar, можем ли мы каким-то образом сказать NHibernate НЕ отображать тип Nullar, даже если он расширяет Bar, который отображается?

Это мои идеи - кажутся правдоподобными?

(Я нуб NHibernate, кстати, но я настойчивый, и не в том смысле, что вы можете спасти меня и отложить на потом.)

person mindplay.dk    schedule 29.04.2011