Всем привет.
Хотелось бы услышать от людей кто делал Undo либо сохранял/восстанавливал состояние объектов в коммерческих winform проектах с data access на NH. Если там какие либо подводные камни свойственные его коллекциям и тп. Заранее благодарю.
Здравствуйте, yonis, Вы писали:
Y>Хотелось бы услышать от людей кто делал Undo либо сохранял/восстанавливал состояние объектов в коммерческих winform проектах с data access на NH. Если там какие либо подводные камни свойственные его коллекциям и тп. Заранее благодарю.
У вас какие-то сложности возникли или вы пока только исследуете? Если второе, то можно немного поподробней, что именно вас интересует.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, <Аноним>, Вы писали:
А>Пока только исследуем этот вопрос. А интересует меня следующее, на сколько мне извесно 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>>
Здравствуйте, Нахлобуч, Вы писали:
А не проще сделать так (изменения выделил жирным, лишнее удалил):
Н>Н>public class Foo
Н>{
Н> private IList<Bar> bars;
Н> // Мапится именно это свойство.
Н> // И доступ к коллекции осуществляется через это свойство.
Н> public IList<Bar> Bars
Н> {
Н> get { return bars; }
Н> protected set { bars = value; }
Н> }
Н>}
Н>
Здравствуйте, 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>>