2010-05-05 2 views
0

У меня есть объект, TrackLog, который имеет составную часть TrackPoints. Я создаю новый TrackLog и добавляю к нему Trackpoints и сохраняю его в БД.Сохраняет объект с коллекцией компонентов, которая должна выполнять SQL DELETE, а затем INSERT с помощью NHibernate?

Когда я хватаю TrackLog снова и добавить новый TrackPoint, вместо того, чтобы делать один SQL INSERT, как я ожидаю, что это делает УДАЛЕНИЕ на всех TrackPoints, связанных с TrackLog, а затем повторно добавляя каждый TrackPoint, который находится в коллекции.

Это выход из NHProf:

UPDATE TrackLog SET Version = 2 etc... 
DELETE FROM TrackPoints WHERE TrackLog_Id = '80cc1e0d' etc... 
INSERT INTO TrackPoints etc.. 
INSERT INTO TrackPoints etc... 
INSERT INTO TrackPoints etc... 

Мой вопрос, это нормальное поведение для сбора компонентов? Это происходит и для моих коллекций enum. Если это не нормальное поведение, как мне изменить мои сопоставления, чтобы он отображал правильное поведение (только один INSERT для добавленного мной TrackPoint)?

ответ

1

Это нормально.

Чтобы избежать этого, объявить свою коллекцию как set вместо bag (и использовать совместимые типы), если ваш случай использования его поддерживает (т.е. не может быть две точки треков с такими же данными)

+0

Спасибо, я сам пришел к тому же самому выводу. Другое дело иметь в виду, что ваши компоненты должны переопределять 'Equals()' и 'GetHashCode()', иначе производительность еще хуже (а не один оператор DELETE, он генерирует DELETE для каждого элемента, затем делает INSERT для каждый раз). –

+0

Да, это правильно, и это имеет смысл, потому что у компонентов нет идентификатора, так что это единственный способ (для NH) рассказать им обособленно. –

Смежные вопросы