Если вы используете наивные тождества, мгновенно ли объекты сохраняются? - PullRequest
0 голосов
/ 26 декабря 2009

В моем приложении asp.net я открываю и закрываю / очищаю сеанс в начале / конце каждого запроса.

С этой настройкой я думал, что это приведет к таким вещам, как:

Entity e = EntityDao.GetById (1);

e.Property1 = "бла";

EntityDao.MakePersistant (е);

e = EntityDao.GetById (1);

e.Property1 // это не будет бла, это будет старое значение, так как запрос не очищен

Но я заметил, что возвращаемое значение было самым последним обновленным значением. Кто-то ответил, что из-за того, как у меня настроена личность?

Может кто-нибудь объяснить это поведение? Поэтому мне не нужно вызывать flush, чтобы убедиться, что он сохраняется в БД?

1 Ответ

0 голосов
/ 29 декабря 2009

Я верю (но могу ошибаться), что причиной этого является кэширование и отслеживание изменений в nHibernate.

Поскольку этот экземпляр Session все еще активен, nHibernate отслеживает изменения, которые вы внесли в 'e'. Когда вы запрашиваете его снова, он включает эти изменения в возвращаемый объект. Что произошло, когда вы вызвали MakePersistant (который я предполагаю, вызывает Session.SaveOrUpdate (e)), так это то, что он сообщил экземпляру Session, что вы собираетесь сохранить эти изменения, таким образом, он знает о них и будет показывать их при вызове Session.Get id) снова.

Если вместо этого вы запустили другой сеанс, а затем вызвали Session.Get (id), вы не увидели бы эти изменения, если бы вы не вызвали Flush (или не закрыли транзакцию, поскольку вам следует использовать транзакцию здесь), поскольку она ничего не знает изменений, внесенных в другой сессии.

Чтобы ответить на ваш другой вопрос, да, вам все равно нужно вызвать Flush или закрыть транзакцию, чтобы гарантировать запись изменений в базу данных . Одна вещь, которая хороша, - то, что вам на самом деле не нужно вызывать SaveOrUpdate (e). Например, этот код вызовет обновление базы данных:

        using (var session = SessionFactory.OpenSession()) 
        using (var trans = session.BeginTransaction()){
            var e = session.Get(id);
            e.Name = "New Name";
            trans.Commit();
        }

nHibernate знает, как обновить 'e', ​​так как он отслеживал изменения, которые были сделаны во время этого сеанса. Когда я фиксирую эту транзакцию, они пишутся. Обратите внимание, что это поведение по умолчанию, и я считаю, что его можно изменить, если вы хотите, чтобы вызывался .SaveOrUpdate ().

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