Re[3]: undo vs NHibernate
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 23.01.07 11:16
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Пока только исследуем этот вопрос. А интересует меня следующее, на сколько мне извесно NH для поддержки агригации и lasy load требует использования собственных коллекций,


Не совсем верно. Для агрегации он использует динамически сгенерированные прокси-классы (см. Castle.DynamicProxy), да и то не всегда, а только в том случае, когда агрегируемый класс был помечен как lazy="true". А насчет коллекций -- он требует того, чтобы тип свойства, на которое мапится та самая коллекция, был типа
IList, ISet, и т.д. Но как и везде в NHibernate это свойство совершенно не обязано быть public (а уж при использовании коллекций просто таки обязано не быть). Я делаю следующим образом:

public class Bar
{
    // Какие-то свойства.
}

public class BarCollection : Collection<Bar>
{
    public BarCollection()
    {
    }
    
    // Вот этот конструктор архиважен.
    public BarCollection(IList<Bar> list) :
        base(list)
    {
    }
}

public class Foo
{
    private IList<Bar> bars;
    
    // Мапится именно это свойство.
    protected IList<Bar> InternalBars
    { 
        get { return bars; }
        set { bars = value; }
    }
    
    // А доступ к коллекции осуществляется через это свойство. Можно
    // создание коллекции соптимизировать, но это и так O(1) операция.
    public BarCollection Bars
    {
        get { return new BarCollection(InternalBars); }
    }
}


А>ну и кроме того объект может находится в кэше мапера.


Их, по сути, два -- тот, который ISession (он же Unit of Work) и опциональный кэш второго уровня...

А>Не будут ли тут проблемы, если скажем при открытии формы я запрошу состояние агрегирующего объекта (вместе с подчиненными объектами), что -то там буду менять, а потом нажму cancel и сделаю откат к сохраненному состоянию.


...от сессии объект можно отцепить с помошью Evict. Но тогда перестанет работать ленивая загрузка. Отцепить можно, например, по нажатию Cancel. Но в таком случае нет гарантии, что остальная система будет работать с валидными данными.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
HgLab: Mercurial Server and Repository Management for Windows
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.