Обновление объекта в nHibernate - PullRequest
2 голосов
/ 17 декабря 2009

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

Вот что я делаю:

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

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

В результате я получаю:

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

DEBUG - игнорирование постоянного экземпляра

DEBUG - объект, уже связанный с сеансом: [DotNetMigrations.Core.Domain.SchemaChange # 129]

UPDATE

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

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

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

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

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

1 Ответ

2 голосов
/ 19 декабря 2009

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

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

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

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