|
NHibernate: custom insert / update / delete
|
|||
---|---|---|---|
#18+
Доброго времени суток Есть БД на Oracle 11g, доступ к которой осуществляется с помощью NHibernate. Проблема в том, что создание/изменение/удаление записей в таблицах БД осуществляется через хранимые процедуры, у которых масса параметров типа OUT. Вызовы ХП в NHibernate удалось "прикрутить" следующим образом: Хранимая процедура - обновление сущности Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Проблема в том, что после вызова метода AuthorMod ядро NHibernate выполняет еще один, свой собственный, Update той же записи в БД, что явно избыточно. Отсюда вопросы 1) Как можно для NHibernate отметить данный экземпляр, как уже сохраненный? Т.е. вызвал свой метод обновления, потом отметил, что экземпляр сохранен (IsDirty = false или нечто вроде). 2) Есть ли более толковый вариант вызова ХП с параметрами типа OUT из NHibernate? Я пробовал в hbm.xml файле указывать атрибут mutable="false" в привязке класса, однако в этом случае собственный NHibernate'овский Update вызывается ДО вызова ХП из метода AuthorMod, а не после, что имело место до добавления mutable="false". Кроме того, мне нужно вызывать ХП не только для INSERT / UPDATE / DELETE, но и для выполнения других задач, не хочется после каждого вызова получать очередной Update из сущности в запись БД. Тестовый проект для .NET 4.0 / MSVS 2010: http://depositfiles.com/files/t5dmdbwm8 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2011, 22:34 |
|
NHibernate: custom insert / update / delete
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 12:21 |
|
NHibernate: custom insert / update / delete
|
|||
---|---|---|---|
#18+
SolYUtor, спасибо за подсказку, но мне нужно немного не то. В данном случае хранимые процедуры имеют OUT-параметры, а с ними NHibernate не работает. Нужно просто сделать так, чтобы после вызова моих ХП NHibernate не выполнял собственные Update той же сущности в БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 18:12 |
|
NHibernate: custom insert / update / delete
|
|||
---|---|---|---|
#18+
Вообще-то все успешно работает, если вызов ХП не оборачивать в транзакцию NHibernate, т.е. из приведенного выше листинга метода AuthorMod на C# убрать строчки Код: plaintext 1. 2.
Но как бы неправильно использовать такие вот решения, полученные методом научного тыка. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 18:44 |
|
NHibernate: custom insert / update / delete
|
|||
---|---|---|---|
#18+
JohnSparrow, Попробуйте покопать в сторону IInterceptor. Хотя я не понимаю, зачем вам NH, если вы даже CRUD операции собираетесь выполнять через хранимки. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2011, 21:21 |
|
NHibernate: custom insert / update / delete
|
|||
---|---|---|---|
#18+
Запросы удобнее делать через NH, через напрямую через ADO.NET. Кроме того, UI окна отчета, состоящего из панели фильтра и грида, замечательно коррелирует со средствами ICriteria. Есть, правда, вариант переместить бизнес-логику из БД в сервер приложений, тогда можно использовать "идеологически чистый" NHibernate, :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2011, 12:15 |
|
|
start [/forum/moderation_log.php?user_name=m_george]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 393ms |
total: | 648ms |
0 / 0 |