Ответ от @OskarBerggren объясняет работу метода Save()
.Я отвечаю с точки зрения UoW.
С ORM, как NHibernate, вы лучше поймете Единица работы , прежде чем использовать ее вживую.Именно в этом и заключается проблема.
UoW отслеживает действия «что делать» в заданной области действия UoW.Таким образом, когда вы звоните Save()
:
- UoW (
ISession
в случае NHibernate) отмечает, что эта сущность должна быть вставлена последняя в некоторой точке . - Добавляет сущность в кэш сеанса.
По поводу пункта 1 выше, «последний в некоторой точке» определяется как FlushMode
.Он может быть вставлен не сразу, в зависимости от установленного режима очистки.
Чтобы сделать ваш тест работоспособным, вы можете либо установить FlushMode
на MANUAL
и позвонить Flush()
после Save()
.Или вы можете установить его на ALWAYS
.Пожалуйста, ознакомьтесь со связанной документацией, прежде чем применять это.Режим промывки следует выбирать осторожно.
Ваш код не подходит для UoW.Я обычно устанавливаю режим сброса на COMMIT
, который лучше всего использует UoW с NHibernate.UoW сбрасывается (все изменения сохраняются) в конце области.
public sealed class DbSession : IDbSession
{
public DbSession()
{
session = sessionFactory.OpenSession();
transaction = session.BeginTransaction();
}
ISession session = null;
ITransaction transaction = null;
/*
* By default, the instance should be dirty.
* Caller should explicitly set the property to 'false' in calling code if everything was fine.
* If caller fail to set this property, it will be assumed that caller do not want to flush
* the changes to database.
*/
bool isDirty = true;
bool IDbSession.IsDirty { set { isDirty = value; } }
public void Dispose()
{
if(session == null)
return;
if(isDirty == false)
transaction.Commit();
else
transaction.Rollback();
transaction.Dispose();
transaction = null;
session.Dispose();
session = null;
}
}