powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate Unit of Work и UI
21 сообщений из 21, страница 1 из 1
NHibernate Unit of Work и UI
    #37718856
CVlasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго вечера всем.
Есть окно (Win Application), состоящее из двух фреймов: слева список (ListBox) сотрудников (класс Person), а справа детальная информация (свойства класса Person). Когда пользователь выбирает сотрудника в списке, я открываю сессию NHibernate и по его имени запрашиваю объект Person из БД, закрываю сессию и затем визуализирую данные о сотруднике в правом окне. Правое окно содержит также список детей сотрудника (List<Child>), соответственно по нажатии на кнопку "Сохранить" я открываю сессию, сновазапрашиваю сотрудника по имени и с полученным Person уже выполняю изменения: обновление полей на основе данных в полях формы, а список детей редактирую вручную: т.е. синхронизирую данные формыс данными Person.Children, считая, что первичнее данные формы. В этом варианте, я не могу использовать привязку.

Порочна ли такая практика?
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37719643
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CVlasovПорочна ли такая практика?
Да. Куча бесполезных запросов к БД.

Правильный вариант выглядит так:
1. При открытии списка открываем сессии, и запрашиваем проекцию списка пользователей, отображаем ее.
2. Когда юзер о открывает пользователя на редактирование, передаём редактирующем окну id-пользователя, открываем в нём новую сессию, и одним запросом тянем сотрудника со всеми его детьми.
3. В процессе редактирования сессия висит открытая.
4. Когда пользователь нажимает сохранить, вызываем session.Flush(), и закрываем ее.
5. Передаём в окно со списком обновлённые данные по сотруднику (без запроса в БД), если на прошлом шаге изменения были успешно сохранены.
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37721005
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ли уж критично, открывать сессию при запросе из списка, или при создании окна.
Как сама сессия, это легковесный продукт, и пока мы ей не работаем, сессия никакой угрозы для памяти не представляет
нет соединений, не открыты транзакции единицы работы, пустой кеш и тд...?
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37721131
CVlasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor2. Когда юзер о открывает пользователя на редактирование, передаём редактирующем окну id-пользователя, открываем в нём новую сессию, и одним запросом тянем сотрудника со всеми его детьми.
3. В процессе редактирования сессия висит открытая.
4. Когда пользователь нажимает сохранить, вызываем session.Flush(), и закрываем ее.
5. Передаём в окно со списком обновлённые данные по сотруднику (без запроса в БД), если на прошлом шаге изменения были успешно сохранены.
А если в процессе сохранения возникли ошибки и изменения не сохранены? Объекты POCO привязаны к контролам, что делать в этой ситуации? Все изменения, внесенные пользователем, потеряются и нужно перезагрузить Person из БД?
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37721235
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CVlasov,
немного не понятно, персон самодостаточный обьект, он все знает про себя и как оно лежит в базе, он отвязан от сессии.
при нарушении, он не пропадает, зачем его перегружать например обрыв связи?
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37721584
CVlasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степиCVlasov,
немного не понятно, персон самодостаточный обьект, он все знает про себя и как оно лежит в базе, он отвязан от сессии.
при нарушении, он не пропадает, зачем его перегружать например обрыв связи?
Т.е. я могу повторно запустить транзакцию и вызвать Flush?
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37721614
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CVlasov,
если сессия в рабочем виде, до да, при откате откатываются служебные настройки объекта
персистентность, флаг изменения, пользовательские не трогаются
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37721719
CVlasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степиCVlasov,
если сессия в рабочем виде, до да, при откате откатываются служебные настройки объекта
персистентность, флаг изменения, пользовательские не трогаются
Т.е.:
1. Открываем сессию.
2. Открываем транзакцию.
3. Загружаем Person в сессию со всеми связанными подчиненными записями (несколько списков: дети, история должностей, выплаченные премии и т.п.).
4. Закрываем транзакцию.
5. Привязываем Person к контролам.
6. Пользователь редактирует Person. Если нужно загрузить справочник, то опять запускаем транзакцию, загружаем в сессию записи справочника, закрываем транзакцию, выводим записи в ListBox и опять работаем только с Person.
7. Пользователь пытается сохранить Person. Запускаем транзакцию, вызываем Save(Person). Возникает исключение - имена дублируются. Откатывает транзакцию, меняем имя на корректное, снова запускаем транзакцию, фиксируем ее. А если потомки Person'а замаплены как Cascade.AllDeleteOrphan, будет работать.

Перефразируя вышесказанное:
я могу использовать одну сессию для повторного сохранения, если первая транзакция была откачена?

P.S. Есть простой способ реализовать INotifyPropertyChanged в POCO-классах, таких как Person?
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37722586
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CVlasovПерефразируя вышесказанное:
я могу использовать одну сессию для повторного сохранения, если первая транзакция была откачена?
Не во всех случаях. Если случится StaleObjectStateException - то сессия будет кидаться исключениями при попытке любых действий с ней. В таком случае надо открывать новую сессию, и делать Merge. Это сохранит изменения, сделанные в вашем объекте.

CVlasovP.S. Есть простой способ реализовать INotifyPropertyChanged в POCO-классах, таких как Person?
Есть отличный способ .
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37724034
CVlasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtorCVlasovПерефразируя вышесказанное:
я могу использовать одну сессию для повторного сохранения, если первая транзакция была откачена?
Не во всех случаях. Если случится StaleObjectStateException - то сессия будет кидаться исключениями при попытке любых действий с ней. В таком случае надо открывать новую сессию, и делать Merge. Это сохранит изменения, сделанные в вашем объекте.

CVlasovP.S. Есть простой способ реализовать INotifyPropertyChanged в POCO-классах, таких как Person?
Есть отличный способ .
Про Merge я не знал.

Может, тогда подскажете как просто реализовать IObservableCollection?
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37724663
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CVlasovМожет, тогда подскажете как просто реализовать IObservableCollection?
Если для NHIbernate - то подскажу .
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37730416
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,
не проще ли применить в данном случае, сессию без состояния.
вытаскиваем листы на грид, связанные сущности грузим лениво сами из мутатора ( три года не работал с хибером)
может он уже и научился лениво сам подгружать..( хотя на вряд ли)
сохраняем персон и сущности в ручную о единице работы заботимся сами.
Все под контролем, при исключении пользуемся той же сессией, там кеш запросов не забит, все чисто, и прозрачно.
первый уровень кеша и нафиг не нужен на вьюху?
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37730429
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон, вместо мутатора читать акцессор
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37730450
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

видите ли, открывать зонтик обычно удобно. Но кто в первый раз открыл его в кармане, на всю жизнь решит неудобно. Так и хибер при корявом использовании становится неудобным.
Вот я не вижу никакой нужды рожать unit of work самому, когда за меня это делает хибер. Опять же непонятно, когда это было, чтобы хибер не умел лениво грузить сущности?
Если сессия живёт относительно недолго, то кеш запросов и сущеностей будет в форме.

Если вам всё это не нужно - то не берите хибер. Есть ведь Dapper , iBatis , BLToolkit , написать свой наконец, и в полной мере насладиться прелестями инфраструктурных задач.
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37730480
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,ну на скоко помню ленивая подгруздка у сессий без состояния не работала,
если сессия трудится только на на грид, то действительно нафиг плодить кеши первого уровня.
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37730483
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиSolYUtor,ну на скоко помню ленивая подгруздка у сессий без состояния не работала, Ааа. Речь про Stateless. Так и есть. Но ленивая загрузка не проблема, если одним запросом загрузить всё, что надо.

Где-то в степиесли сессия трудится только на на грид, то действительно нафиг плодить кеши первого уровня.
на грид можно и проекции. Целые сущности там ни к чему. Хотя сессии без состояния можно и сущности грузить.
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37730488
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,
Вот подскажите такую фишку.
Есть интерфейс IValidate, выкидываем в сущность проверку.
А есть ли интерфейсы типа IChanged изменения объекта, ( искал не нашел)
в прочем мжно пользоваться и IValidate, но не ко времени, желательно он бы срабатывал когда сущность
проходит конвеер единицы работы, и исходил бы из кеша ( первый уровень аки Unit of Work)
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37730490
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы точно от него не оказался, в некоторых местах, тем более реализовать патчем не составит труда, а вот релизно было бы не плохо ( если нет)
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37730503
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

C IChanged есть некоторые сложности, и проблема тут не в NH. Сам хибер отслеживает изменения, но делает это специфически. Ему важны новая сущность, изменения в сохранённой сущности, удаление в сущености. Если вы хотите получать детализацию по изменениям, то количество вопросов становится гораздо большим.
Скажем, есть новая сущность. Вот создали вы конструктором новую сущность. Что в ней изменилось? Возвращать все свойства? Ни одного? Спец. статус, что новая сущность? А если вы сохранили ее в сессии (т.е. синхронизировали состояние с бд), а потом еще раз изменили, что считать изменением?

Ответы на многие из эти вопросы во много зависит от вашей задачи, как вы ведите изменения. А хиберу они интересны только в своём ключе сохранения.

Как я решал такую задачу, если бы она у меня возникла? В общем, Castle.DynamicProxy + своя реализация хиберовской IProxyFactory (заодно это открывает дорогу к инъекции зависимостей из контейнера). Другие виды AOP'а, вроде PostSharp'а никто не отменял.
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37730507
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,
мне интересен был бы такой подход

Person o;

............

session.Save(o)// выдала грязный объект
...........
............
session.Save(o) выдала грязный объект
.....
.......

session.Flush();
...
Рейтинг: 0 / 0
NHibernate Unit of Work и UI
    #37730812
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

найду свободную минутку поковыряться - напишу.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate Unit of Work и UI
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]