NHibernate ISession.Update - PullRequest
       1

NHibernate ISession.Update

3 голосов
/ 18 сентября 2010

Я заметил, используя log4net, что при вызове ISession.Update он обновляет все измененные объекты.
Например:


// Change 2 instances 
user1.IsDeleted = true;
user2.UserName = "Xyz";
// Call session.Update to update the 2 users
using (ITransaction transaction = session.BeginTransaction())
{
    Session.Update(user1); // This updates both user1 & user2
    transaction.Commit();
}
using (ITransaction transaction = session.BeginTransaction())
{
    Session.Update(user2); // Now there is no need for this
    transaction.Commit();
}

Это стандартное поведение NHibernate или как-то связано с моим файлом сопоставления?
Могу ли я сделать обновление NHibernate по одному?

Ответы [ 2 ]

12 голосов
/ 19 сентября 2010

Это нормальное и поведение по умолчанию :

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

С Ловушки Hibernate, часть 2 :

В) Требуется ли сохранять и обновлять внутри транзакций?

Функция Save () требуется только для непостоянных объектов (например, новых объектов),Вы можете использовать Обновление, чтобы вернуть объект, который был исключен, обратно в сеанс.

С Автоматическое (грязная проверка) поведение обновления NHibernate :

Я только что обнаружил, что если я получу объект из сеанса NHibernate и изменим свойство объекта, NHibernate автоматически обновит объект при коммите без моего вызова Session.Update (myObj)!

Ответ: Вы можете установить для параметра Session.FlushMode значение FlushMode.Never.Это сделает ваши операции явными, например: on tx.Commit () или session.Flush ().Конечно, это все равно будет обновлять базу данных после коммита / сброса.Если вам не нужно это поведение, вызовите session.Evict (yourObj), и оно станет временным, и NHibernate не будет выдавать для него никаких команд db.

2 голосов
/ 24 июля 2011

Это поведение по умолчанию, когда FlushMode сеанса имеет значение Auto или Commit.

В этих случаях вызов транзакции .Commit () сбрасывает сеанс и обновляет ВСЕ постоянные объекты

Так что, если вы удалите вызовы Session.Update, это не будет иметь никакого значения

Могу ли я сделать обновление NHibernate одно за другим?

Да. используйте FlushMode.Never или отложите принятие сеанса, если это возможно. Я думаю, вам не нужно использовать Evict для этого случая

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...