2011-11-09 22 views
0

我有一个使用nHibernate的MVC应用程序,因为它的数据持久性,但由于某种原因,尽管我的对象从会话中逐出,但它仍然被持久保存到数据库中。对象没有从nhibernate会话中分离

我有一个复杂的对象,我让用户应用更改并重新计算基于父对象上属性的新值的子集合。但我不希望这些更改持续存在,因为我将结果更改传递回视图以仅作为预览呈现。用户可以提交它们,但使用不同的操作。

在我在此过程中为我的对象查询nHibernate之后,立即将它从会话中逐出,但由于某种原因它仍然存在。

根据nHibernate Profiler,它似乎是由于我在一个过滤器装饰我的控制器行为中的事务提交。这是因为我读到的最佳做法是关于从数据库中读取的项目没有被缓存到二级缓存,除非事务被提交,即使没有做出修改。尽管如此,它并不能解释为什么提交会导致被驱逐的对象持久保存到数据库中。我假设我错过了一些可以解释这种行为的东西,但我不确定是什么?

回答

0

我是对的,你正在查询一个对象,然后从会话中逐出并对用户预览进行更改?

您是否正在更改儿童收藏?因为据我记忆,当从NH中驱逐对象时,它不会自动驱逐相关的子对象(至少在NH v2.x中)。

所以,当你改变一些子对象(并且你没有明确驱逐它)时,它会试图持久化它,并且由于某些级联规则也会尝试持久化父对象。

+0

我真的开始怀疑evict了。我搜索的内容越多,我发现Evict()就会从第一级缓存中删除一个项目。但是很少提及它脱离会议的任何事情。我希望能够翻转一个开关,并使内存中的对象暂时而不是持久。 –

+0

我还没有使用过Evict()。其实我试图用它,但放弃我提到的原因。 我只是做一个回滚,当我不想保存实体(例如保存验证失败之前)。 – Siim