Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
Добрый день, помогите найти ошибку в маппингах. (Используем Fluent). При том, что записи и изменения entity на первый взгляд не было, т.е. при простом чтении (в пределах созданного UnitOfWork; без UnitOfWork проблема не возникает) получаем кучу INSERT и DELETE, которые сначала удаляют элементы таблицы со связью M:M, а потом вставляют обратно. Это убивает производительность. Команды отправляются после простого запроса (Session.CreateCriteria, а потом получаем для запроса список сущностей из базы), причем запрос был на одну сущность, а таблица M:M между двумя другими. (Видимо, запросом что-то просто сбрасывается или flush-ится, а сами INSERT и DELETE "накопились" ранее). Вот сущности, связь между которыми вызывает проблему : назовем их Document и WareHouse. Научился генерировать XML (метод .ExportTo), вот что в нем находится: Document.hbm.xml: <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true"> <class xmlns="urn:nhibernate-mapping-2.2" mutable="true" where="DeletionDate is null" name="Name.Document, Name, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Document"> ... <bag cascade="all" name="WareHouses" table="DocumentWareHouse" mutable="true"> <key foreign-key="PFK_WareHouse_Document"> <column name="DocumentId" /> </key> <many-to-many class="Name.WareHouse, Name, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> <column name="WareHouseId" /> </many-to-many> </bag> В маппинге, а также в entity WareHouse ничего про Document нет. Вот из entity Document: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2011, 20:56 |
|
||
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
Смущает также, откуда взялись mutable? Ведь не должны были, да и ключи у нас не mutable, а обычные, т.е. surrogate key. Их почему-то сгенерировал Fluent. Вот что находится в маппинге для флуента на C#: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Вредные запросы идут такого вида: Код: plaintext 1. 2. 3. В чем проблема? Очень помогла бы Ваша помощь, многоуважаемые! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2011, 21:07 |
|
||
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
NHibernate_User_, похоже, вы и сам знаете ответ: скорее всего где-нибудь ранее в рамках сессии поковыряли коллекцию, и в один момент nhibernate решил сохранить изменения в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 09:52 |
|
||
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
Странно, уверен, что эта коллекция не трогается. В рамках задачи она как бы read-only. И задача-то - показать описание сущности Document пользователю, без каких-либо изменений :( Коллекция чисто проходится на чтение. Может, все дело в cascade:all? Из-за таких Insert и Delete вся программа никуда не годится :( Они не только здесь вылезают. Вторую проблему, из-за которой у приложения отсутствует производительность (почему-то не работает LazyLoad), я изложу во втором топике. А здесь так и не понятно, как быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 10:12 |
|
||
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
NHibernate_User_ Код: plaintext 1. 2. 3. 4. 5. 6. Упс... Просмотрел. У вас проблема не в маппингах, а вот в этой гадости: wareHouses = value.ToList<WareHouse>(); После загрузки сущности хибер подменяет реализацию коллекции на свою, с помощью которой отслеживает изменения в ней, и выполняет ленивую загрузка. А вы методом ToList() вынуждаете хибер сразу же загрузить коллекцию, и присваиваете полю новый объект, за которым хибер уже не следит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 10:20 |
|
||
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
Самое интересное, что если не входить в UnitOfWork (isolationLevel : ReadCommitted), то никаких INSERT и DELETE не происходит :( Ведь изменения должны, по идее, не зависеть от UnitOfWork. Это вообще непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 10:22 |
|
||
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо за решение проблемы с LazyLoad! Пойду проверять :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 10:24 |
|
||
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
А как нам решить следующую проблему? Мы, конечно, можем заменить код на такой: Код: plaintext 1. Более того, у нас даже маппинги Fluent находятся в другой сборке. Какие методы посоветуете, чтобы грамотно скрыть метод Add коллекции WareHouses от остальных частей приложения? Должно работать только через метод AddWareHouse самой entity. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 14:47 |
|
||
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
Извините за ошибку в предыдущем примере - имелось в виду, конечно же, IList, а не IEnumerable. Если же мы поставим IEnumerable, то даже само Entity не сможет изменить коллекцию. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 15:10 |
|
||
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
C другой стороны, пробую сделать так: Код: plaintext 1. 2. 3. 4. 5. но тут беда в том, что маппинги, как я сказал выше, в другой сборке и не видят entities :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 15:36 |
|
||
|
NHibernate (маппинги через Fluent) делает множество INSERT и DELETE
|
|||
|---|---|---|---|
|
#18+
NHibernate_User_, Элементарно, Ватсон: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 16:47 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=37277943&tid=1350771]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 264ms |
| total: | 382ms |

| 0 / 0 |
