powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate пакетное обновление, добавление...
13 сообщений из 13, страница 1 из 1
NHibernate пакетное обновление, добавление...
    #37337410
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно начну с примера: допустим есть список сотрудников, который отображается в гриде.
Пользователь добавляет, изменяет, удаляет записи, затем нажимает кнопку "Сохранить изменения".

Есть ли в NHibernate возможность провести все изменения пользователя в БД одной командой?

Или нужно проходить по всем элементам списка и для каждого вызывать update, insert, delete? И как в таком случае понять какие изменения были произведены над записью (изменили, добавили...)?
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37337529
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Balda_1Собственно начну с примера: допустим есть список сотрудников, который отображается в гриде.
Пользователь добавляет, изменяет, удаляет записи, затем нажимает кнопку "Сохранить изменения".

Есть ли в NHibernate возможность провести все изменения пользователя в БД одной командой?

Это поведение сессии NHibernate по умолчанию.
Balda_1Или нужно проходить по всем элементам списка и для каждого вызывать update, insert, delete? И как в таком случае понять какие изменения были произведены над записью (изменили, добавили...)?
Для каждого созданного объекта надо предварительно вызвать session.Persist, для удаления - session.Delete. Изменения в загруженных из бд объектах отслеживаются автоматически.
По окончании работы вызвать session.Flush(), а лучше использовать транзакции. Все изменения будут сброшены в бд в последний момент.
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37337588
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня все действия с БД реализованы в WCF сервисе.
После правок пользователя в службу передается список IList<People>, который содержит измененные (добавленные, удаленные) записи.
Как определить что необходимо вызвать для каждого элемента списка: session.Delete, session.Update или session.Save? И как реализовать это в рамках одной транзакции?
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37337668
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Balda_1,

NHibernate даст вам множество вариантов :) Выскажу своё мнение.

Начнём с удаления. Удалять по одному неэффективно с загрузкой - неэффективно. Если есть список удалённых, то одной строкой и без загрузки это можно сделать с помощью HQL запроса:
Код: plaintext
1.
2.
3.
4.
Session
.CreateQuery("delete from People where People.Id in (:idList)")
.SetParameter("idList", idList)
.ExecuteUpdate();

С обновляемыми дело обстоит сложнее, поскольку их надо грузить в любом случае. Мой вариант примерно такой: загрузить все изменяемые одним запросом, объединить с полученными от пользователя х, и отправить в БД.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// Грузим сразу всех людей, которых будем изменять. 
Session
.CreateQuery("from People where People.Id in (:idList)")
.SetParameter("idList", idList)
.List<Report>();
//updatedPeople - изменённые люди, полученные от пользователя. 
foreach (var human in updatedPeople)
{
Session.Merge(human);
}

И все эти операции заключить в транзакцию.
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37337773
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А у классов NHibernate не генерируется какое-нибуть свойство вроде State (Deleted, Updated, added) по которому можно отследить что пользователь сделал с данной записью?

Просто в моей ситуации получается так: грузим всех людей, потом пользователь добавляет, удаляет, изменяет и передает новый список в службу. Получается нужно определить что и для каких записей вызвать...
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37338059
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эффективное пакетное обновление может быть только одно - хранимая процедура. В качестве параметра обновляемых данных - xml.
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37338490
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Balda_1А у классов NHibernate не генерируется какое-нибуть свойство вроде State (Deleted, Updated, added) по которому можно отследить что пользователь сделал с данной записью?

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

NHibernate ведёт учёт изменений в рамках сессии, неявным образом. Но вам этот способ не подойдёт, т.к. время жизни сессии скорее ограничено выполнением WCF запроса. В остальном NHibernate построен по принципу Persistence Ignorance. Т.е. объекты ничего не знают о том кто, когда и как их сохраняет.

В вашем случае можно сервер DTO-объект типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
public class PeopleChanges 
{
  People[] Created {get;set;}
  People[] Modified{get;set;}
  People[] Deleted{get;set;}
}
В этом случае явно видно, что с чем делать. Задача клиентской части будет в правильном формирование этого списка, что не так уже сложно.
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37338492
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЭффективное пакетное обновление может быть только одно - хранимая процедура. В качестве параметра обновляемых данных - xml.
Хм... А зачем тогда NHibernate?
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37338617
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor,

спасибо за помощь ))
Остановлюсь на реализации PeopleChanges.
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37339113
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor,
подскажите, пожалуйста, где можно почитать про то как сессия хранит информацию об изменении объектов и как эту информацию можно вытянуть.
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37339209
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtorNHibernate ведёт учёт изменений в рамках сессии, неявным образом. Но вам этот способ не подойдёт, т.к. время жизни сессии скорее ограничено выполнением WCF запроса.


Если данные загружаются в рамках одной сессии, а модифицируются в другой сессии, то откуда NHibernate берет информацию об изменении? Каждый раз при открытии сессии подгружает информацию обо всех объектах?
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37339503
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Balda_1,

рассказывать о понятиях и принципах работы NHibenate в рамках форума довольно долго... Рекомендую осилить вот эту книгу .

Balda_1SolYUtor,
подскажите, пожалуйста, где можно почитать про то как сессия хранит информацию об изменении объектов и как эту информацию можно вытянуть.
Главный вопрос: зачем она вам?
Хотите вытянуть внутреннее состоянии сессии - то скорее всего вы на неправильном пути. Это называет Trigger-Driven Development, когда вы получив изменения, пытаетесь разобраться, что же произошло, и что с этим дальше делать. Это болезненный подход. Крайне не рекомендую.
...
Рейтинг: 0 / 0
NHibernate пакетное обновление, добавление...
    #37339544
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor,

спасибо за ссылку на литературу )) буду штудировать.

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


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