|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
Собственно начну с примера: допустим есть список сотрудников, который отображается в гриде. Пользователь добавляет, изменяет, удаляет записи, затем нажимает кнопку "Сохранить изменения". Есть ли в NHibernate возможность провести все изменения пользователя в БД одной командой? Или нужно проходить по всем элементам списка и для каждого вызывать update, insert, delete? И как в таком случае понять какие изменения были произведены над записью (изменили, добавили...)? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2011, 15:32 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
Balda_1Собственно начну с примера: допустим есть список сотрудников, который отображается в гриде. Пользователь добавляет, изменяет, удаляет записи, затем нажимает кнопку "Сохранить изменения". Есть ли в NHibernate возможность провести все изменения пользователя в БД одной командой? Это поведение сессии NHibernate по умолчанию. Balda_1Или нужно проходить по всем элементам списка и для каждого вызывать update, insert, delete? И как в таком случае понять какие изменения были произведены над записью (изменили, добавили...)? Для каждого созданного объекта надо предварительно вызвать session.Persist, для удаления - session.Delete. Изменения в загруженных из бд объектах отслеживаются автоматически. По окончании работы вызвать session.Flush(), а лучше использовать транзакции. Все изменения будут сброшены в бд в последний момент. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2011, 16:19 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
У меня все действия с БД реализованы в WCF сервисе. После правок пользователя в службу передается список IList<People>, который содержит измененные (добавленные, удаленные) записи. Как определить что необходимо вызвать для каждого элемента списка: session.Delete, session.Update или session.Save? И как реализовать это в рамках одной транзакции? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2011, 16:42 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
Balda_1, NHibernate даст вам множество вариантов :) Выскажу своё мнение. Начнём с удаления. Удалять по одному неэффективно с загрузкой - неэффективно. Если есть список удалённых, то одной строкой и без загрузки это можно сделать с помощью HQL запроса: Код: plaintext 1. 2. 3. 4.
С обновляемыми дело обстоит сложнее, поскольку их надо грузить в любом случае. Мой вариант примерно такой: загрузить все изменяемые одним запросом, объединить с полученными от пользователя х, и отправить в БД. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
И все эти операции заключить в транзакцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2011, 17:16 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
А у классов NHibernate не генерируется какое-нибуть свойство вроде State (Deleted, Updated, added) по которому можно отследить что пользователь сделал с данной записью? Просто в моей ситуации получается так: грузим всех людей, потом пользователь добавляет, удаляет, изменяет и передает новый список в службу. Получается нужно определить что и для каких записей вызвать... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2011, 18:17 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
Эффективное пакетное обновление может быть только одно - хранимая процедура. В качестве параметра обновляемых данных - xml. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2011, 22:21 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
Balda_1А у классов NHibernate не генерируется какое-нибуть свойство вроде State (Deleted, Updated, added) по которому можно отследить что пользователь сделал с данной записью? Просто в моей ситуации получается так: грузим всех людей, потом пользователь добавляет, удаляет, изменяет и передает новый список в службу. Получается нужно определить что и для каких записей вызвать... NHibernate ведёт учёт изменений в рамках сессии, неявным образом. Но вам этот способ не подойдёт, т.к. время жизни сессии скорее ограничено выполнением WCF запроса. В остальном NHibernate построен по принципу Persistence Ignorance. Т.е. объекты ничего не знают о том кто, когда и как их сохраняет. В вашем случае можно сервер DTO-объект типа: Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 09:15 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
МСУЭффективное пакетное обновление может быть только одно - хранимая процедура. В качестве параметра обновляемых данных - xml. Хм... А зачем тогда NHibernate? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 09:16 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
SolYUtor, спасибо за помощь )) Остановлюсь на реализации PeopleChanges. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 10:33 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
SolYUtor, подскажите, пожалуйста, где можно почитать про то как сессия хранит информацию об изменении объектов и как эту информацию можно вытянуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 13:20 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
SolYUtorNHibernate ведёт учёт изменений в рамках сессии, неявным образом. Но вам этот способ не подойдёт, т.к. время жизни сессии скорее ограничено выполнением WCF запроса. Если данные загружаются в рамках одной сессии, а модифицируются в другой сессии, то откуда NHibernate берет информацию об изменении? Каждый раз при открытии сессии подгружает информацию обо всех объектах? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 14:01 |
|
NHibernate пакетное обновление, добавление...
|
|||
---|---|---|---|
#18+
Balda_1, рассказывать о понятиях и принципах работы NHibenate в рамках форума довольно долго... Рекомендую осилить вот эту книгу . Balda_1SolYUtor, подскажите, пожалуйста, где можно почитать про то как сессия хранит информацию об изменении объектов и как эту информацию можно вытянуть. Главный вопрос: зачем она вам? Хотите вытянуть внутреннее состоянии сессии - то скорее всего вы на неправильном пути. Это называет Trigger-Driven Development, когда вы получив изменения, пытаетесь разобраться, что же произошло, и что с этим дальше делать. Это болезненный подход. Крайне не рекомендую. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 15:52 |
|
|
start [/forum/topic.php?fid=17&fpage=43&tid=1350705]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 136ms |
0 / 0 |