2009-12-17 7 views
2

Я новичок в nHibernate, так что, вероятно, это будет довольно глупый вопрос. Но в любом случае сохранение объекта прекрасное, обновление его не работает.Обновление объекта в nHibernate

Это то, что я делаю:

using (ISession session = _sessionFactory.OpenSession()) 
{ 
    session.SaveOrUpdate(schemaChange); 
    schemaChange.ScriptName = "New one"; 
    session.SaveOrUpdate(schemaChange); 
} 

Первый SaveOrUpdate вставляет schemaChange в базе данных. Второй должен обновить один и тот же объект, но nHibernate этого не делает.

В выходных я получаю:

DEBUG - постоянный экземпляр: DotNetMigrations.Core.Domain.SchemaChange

ОТЛАДКИ - игнорируя стойкий экземпляр

ОТЛАДКИ - объект уже связан с сессией: [DotNetMigrations .Core.Domain.SchemaChange # 129]

UPDATE

Ну, как это было так просто (и глупый вопрос), я нашел это сам:

session.SaveOrUpdate(schemaChange); 
schemaChange.ScriptName = "New one"; 
session.Flush(); 

Делает вид. nHibernate действительно превосходит любой инструмент orm, с которым я работал.

Что я могу не понять, почему существует метод SaveOrUpdate ... Если вы обновляете, то это не объект, автоматически связанный с сеансом? (потому что вы вытащили его из db первым способом. Если вы не отправили его, например, Flex RIA, и он вернулся)

Итак, откуда вы знаете, если объект уже связан, либо с сделать SaveOrUpdate() или просто Flush()?

+0

Возможно, вы ответили на свой вопрос и получили значок здесь ... ^^ – Romain

+0

Да, это сделало бы мою жизнь достойной ;-) –

ответ

2

Вы можете использовать метод Session.Contains (object), чтобы понять это. Разница между Save() и Update() заключается в том, что Save присваивает Id, если это необходимо, потому что Update() терпит неудачу, если объект не имеет ключа или ключ не существует в базе данных.

SaveOrUpdate исправляет некоторые проблемы, связанные с работой с переходными объектами, если вам все равно, какое состояние объекта вы можете назвать, но это вовсе не святой Грааль. Если вы знаете, в каком состоянии находится объект, я бы предложил назвать точный метод.

Надеюсь, это поможет немного разъяснить.

Смежные вопросы