undo vs NHibernate
От: yonis Россия  
Дата: 22.01.07 15:19
Оценка:
Всем привет.
Хотелось бы услышать от людей кто делал Undo либо сохранял/восстанавливал состояние объектов в коммерческих winform проектах с data access на NH. Если там какие либо подводные камни свойственные его коллекциям и тп. Заранее благодарю.
Re: undo vs NHibernate
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 23.01.07 09:43
Оценка:
Здравствуйте, yonis, Вы писали:

Y>Хотелось бы услышать от людей кто делал Undo либо сохранял/восстанавливал состояние объектов в коммерческих winform проектах с data access на NH. Если там какие либо подводные камни свойственные его коллекциям и тп. Заранее благодарю.


У вас какие-то сложности возникли или вы пока только исследуете? Если второе, то можно немного поподробней, что именно вас интересует.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
HgLab: Mercurial Server and Repository Management for Windows
Re[2]: undo vs NHibernate
От: Аноним  
Дата: 23.01.07 10:39
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>У вас какие-то сложности возникли или вы пока только исследуете? Если второе, то можно немного поподробней, что именно вас интересует.


Пока только исследуем этот вопрос. А интересует меня следующее, на сколько мне извесно NH для поддержки агригации и lasy load требует использования собственных коллекций, ну и кроме того объект может находится в кэше мапера. Не будут ли тут проблемы, если скажем при открытии формы я запрошу состояние агрегирующего объекта (вместе с подчиненными объектами), что -то там буду менять, а потом нажму cancel и сделаю откат к сохраненному состоянию.Меня интересует именно как на это будет смотреть NH, может надо заранее сделать некую последовательность действий, то как отсоединить объект от кэша и тому подобное.
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
Re[4]: undo vs NHibernate
От: yonis Россия  
Дата: 23.01.07 11:57
Оценка:
спасибо
Re[4]: undo vs NHibernate
От: MatFiz Россия  
Дата: 23.01.07 13:35
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

А не проще сделать так (изменения выделил жирным, лишнее удалил):

Н>
Н>public class Foo
Н>{
Н>    private IList<Bar> bars;
    
Н>    // Мапится именно это свойство.
Н>    // И доступ к коллекции осуществляется через это свойство.
Н>    public IList<Bar> Bars
Н>    { 
Н>        get { return bars; }
Н>        protected set { bars = value; }
Н>    }
Н>}
Н>
How are YOU doin'?
Re[5]: undo vs NHibernate
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 23.01.07 15:21
Оценка:
Здравствуйте, MatFiz, Вы писали:

Н>>
Н>>public class Foo
Н>>{
Н>>    private IList<Bar> bars;
    
Н>>    // Мапится именно это свойство.
Н>>    // И доступ к коллекции осуществляется через это свойство.
Н>>    public IList<Bar> Bars
Н>>    { 
Н>>        get { return bars; }
Н>>        protected set { bars = value; }
Н>>    }
Н>>}
Н>>


Дык IList<Bar> — это ж не совсем коллекция.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
HgLab: Mercurial Server and Repository Management for Windows
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.