Во многих случаях вам не нужно беспокоиться, когда NHibernate мигает.
Вам нужно вызывать flush, только если вы создали свое собственное соединение , потому что NHibernate не знает, когда вы фиксируете его.
Что действительно важно для вас, так это сделка. Во время транзакции вы изолированы от других транзакций, это означает, что вы всегда видите свои изменения при чтении из базы данных и не видите других изменений (если они не зафиксированы). Поэтому вам не нужно беспокоиться, когда NHibernate обновляет данные в базе данных, если они не зафиксированы. В любом случае это никому не видно.
NHibernate сбрасывает, если
- Вы вызываете коммит
- перед запросами, чтобы обеспечить фильтрацию по фактическому состоянию в памяти
- при вызове флеша
Пример:
using (session = factory.CreateSession())
using (session.BeginTransaction())
{
var entity = session.Get<Entity>(2);
entity.Name = "new name";
// there is no update. NHibernate flushes the changes.
session.Transaction.Commit();
session.Close();
}
Сущность обновляется при фиксации. NHibernate видит, что ваш сеанс грязный, и сбрасывает изменения в базу данных. Вам нужно обновлять и сохранять, только если вы внесли изменения вне сеанса. (Это означает, что с отсоединенной сущностью, которая является сущностью, не известной сеансом).
Замечания по производительности: Flush не только выполняет необходимые операторы SQL для обновления базы данных. Он также ищет изменения в памяти. Поскольку в POCO нет грязного флага, необходимо сравнить каждое свойство каждого объекта в сеансе с его кэшем первого уровня. Это может стать проблемой производительности, когда это делается слишком часто. Есть несколько вещей, которые вы можете сделать, чтобы избежать проблем с производительностью:
- Не смывать в петлях
- Избегать сериализованных объектов (сериализация необходима для проверки изменений)
- Используйте объекты только для чтения , когда это необходимо
- Установить mutable = false при необходимости
- При использовании пользовательских типов в свойствах реализуйте эффективные методы Equals
- Осторожно отключите автоматическую очистку, когда вы уверены, что знаете, что делаете.