2012-05-02 6 views
2

Я пытаюсь обновить запись с помощью nHibernate. Я попробовал несколько решений, но никто из них не работает (не показывает ошибки, данные bu также не обновляются).
Первый код:Обновление nHibernate не работает для существующего объекта

MyRepository rep = new MyRepository(GetCurrentSession()); 
UserPost post = rep.GetById(id); 
post.ValidTo = date; 
rep.Update(post); 

Второй код:

ISession session = GetCurrentSession(); 
MyRepository rep = new MyRepository(GetCurrentSession()); 
UserPost post = rep.GetById(id); 
post.ValidTo = date; 
rep.Update(post); 
session.Update(post); 
session.Transaction.Commit(); 
session = null; 

Может somedy есть предложение?

ответ

1

Действительно ли UserPost нанесен на карту? Используете ли вы файлы .hbm.xml (обратите внимание на hbm), а файл xml помечен как встроенный ресурс?

enter image description here

По моему опыту, если объект не отображается NHibernate не жалуется и не выдаст ошибку.

На самом деле, глядя на ваш код более подробно вы не зовем session.Save

+1

Спасибо человеку! Он был правильно нанесен на карту, но ваши предложения дали мне понять, что нужно проверить. В моем файле сопоставления 'mutable' был установлен' false' – JNM

+0

Да, ошибка не возникает, если определено 'mutable =" false "'. Хороший улов – Rippo

5

1) Вы должны смыва сессии, если вы не используете transaction`:

var post = _session.Load<Post>(id); //assumes this record exists in the db 
post.SomeAttribute=somenewvalue; 
_session.SaveOrUpdate(post); 
_session.Flush; 

2) Я не видны ли транзакции? Вам нужно начать транзакцию для фиксации.

using(var transaction = _session.BeginTransaction()){ 
    _session.SaveOrUpdate(post); 
    transaction.commit(); 
} 
0

Если вы хотите обновить некоторые поля сохраняются аудируемого лица, вы не должны вызывать Session.update() или Session.saveOrUpdate(), вы можете использовать session.Flush() или операции:

MyRepository rep = new MyRepository(GetCurrentSession()); 
UserPost post = rep.GetById(id); 
post.ValidTo = date; 
rep.Flush(); // session.Flush() 

OR 

using(var transaction = _session.BeginTransaction()){ 
    UserPost post = rep.GetById(id); 
    post.ValidTo = date; 
    transaction.commit(); 
} 
3
using(var transaction = _session.BeginTransaction()){ 
    _session.SaveOrUpdate(post); 
    transaction.commit(); 
} 

У меня это пакетное обновление возвращает rowcount = 0, но ожидается 1 исключение. Но это работает