nhibernate事务是否只能刷新提交给会话的更改?

时间:2014-04-08 13:07:23

标签: c# session nhibernate transactions flush

我们说我从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只保存我提供给它的实体?

1 个答案:

答案 0 :(得分:1)

您可以调用ISession.Evict从会话中删除对象。我的记忆是,这只影响作为参数传递的对象,而不影响整个对象的图形,因此不会驱逐对子集合的更改。

我怀疑你的工作单位太长了。对您不希望持久保存到数据库的实体进行更改是不常见的。

哦,并且不需要SaveOrUpdate调用。