У меня двухуровневая (не веб-система) система, в которой я загружаю некоторые объекты в системную память и время от времени сбрасываю их обратно в базу данных. Предположим, есть только один объект, который мне нужно обновить, но этот объект представляет собой довольно большой граф, содержащий, возможно, сотни объектов, и я использую каскад, чтобы сохранение распространялось на весь граф.
Когда Session.Update (the_big_object) вызывается во втором сеансе, NHibernate «правильно» переопределяет каждую отдельную сущность всего графа объектов в базу данных, создавая множество обновлений, даже если они не изменены. Это понятно, потому что он понятия не имеет, что было изменено за пределами сеанса. Использование Session.Merge (the_big_object) мало помогает, так как потребует большого количества запросов.
Проблема в моем случае, обычно на большом графике есть только несколько сущностей, которые фактически изменены. Я думаю о том, что вместо использования каскада для сохранения всего объекта, возможно, будет хорошей идеей сохранить грязную коллекцию сущностей в памяти и очищать их только при необходимости. Для этого мне может понадобиться добавить грязный флаг к этим классам, привязанным к их установщикам и т. Д.
Тогда я подумал, разве NHibernate не делал внутри сессии, чтобы определить, какие объекты грязные? Все эти прокси / версии прекрасно работают для постоянных объектов, но не для отдельных объектов (или нет?). Я просто чувствую себя глупо, когда мне нужно сделать это снова вручную.
Есть ли какие-либо предложения / подходы, которые я могу предпринять, или есть какой-то магический трюк, который я упускаю?
Большое спасибо!