Как NHibernate реализует отслеживание изменений?

Поддерживает ли nhibernate-прокси какие-либо умные задания для эффективного отслеживания изменений? Или он поддерживает только то, что Entity Framework вызывает отслеживание изменений на основе моментальных снимков?

Ответ 1

Он основан на снимках.

При загрузке объекта его состояние сохраняется в сеансе как объект [].

При промывке текущее состояние преобразуется в объект [] и сравнивается с исходным состоянием, чтобы определить, какие свойства загрязнены.

Это более эффективно по многим причинам. Один из них заключается в том, что вам не нужен прокси-сервер для отслеживания изменений. Другим является то, что если вы установите свойство на другое значение и затем вернете его, объект будет считаться не грязным, что позволит избежать ненужного вызова БД.

Ответ 2

Изменения в NHibernate и EntityFramework изменяются по-разному. Entity Framework отслеживает изменения самой сущности. NHibernate отслеживает изменения в сеансе.

Отслеживание изменений в объекте требует большего объема памяти (поскольку вы сохраняете значения до и после значений). Сущности могут сохранять отслеживание изменений даже после отключения от ObjectContext.

Отслеживание изменений в сеансе более эффективно в целом, но если вы отключите сущность от сеанса, вы потеряете отслеживание изменений.