我们说我从SessionFactory打开一个ISession。
在一段有限的时间内(不长),这个会话是活着的并且被使用了。 我使用此会话从数据库中获取实体,并根据一些复杂的业务规则更改某些实体。 然后我只想保存一些已更改的实体。
所以,很自然地:
ITransaction t = null;
try
{
t = session.BeginTransaction();
session.SaveOrUpdate(entity);
t.Commit();
}
catch (Exception ex)
{
this.Logger.Error("Transaction failed.", ex);
if (t != null)
t.Rollback();
throw;
}
finally
{
if (t != null)
t.Dispose();
}
但是,根据NH文档,当调用事务提交时,将刷新会话。这意味着所有 脏实体都会被保留,即使是那些我没有传递给SaveOrUpdate的实体。如果某些人没有处于有效状态(例如,不再设置 not null fk),一切都会完全爆炸 - 即使我试图保存的实体有效。
有没有办法告诉NH只保存我提供给它的实体?
答案 0 :(得分:1)
您可以调用ISession.Evict
从会话中删除对象。我的记忆是,这只影响作为参数传递的对象,而不影响整个对象的图形,因此不会驱逐对子集合的更改。
我怀疑你的工作单位太长了。对您不希望持久保存到数据库的实体进行更改是不常见的。
哦,并且不需要SaveOrUpdate调用。