如何在nHibernate中创建只读会话?

时间:2009-04-20 13:14:08

标签: nhibernate

是否可以在nHibernate中创建只读连接?

只读:nHibernate不会隐式或明确地清除对底层数据库的任何更改。

当关闭nhibernate连接时,它会自动清除对持久对象的更改。

将刷新模式设置为 never 是一种方法 - 但是可以反转(即某些代码可以重置刷新模式)。

4 个答案:

答案 0 :(得分:14)

我认为您已经找到了解决方案,将刷新模式设置为never。是的,它是可更改的,但即使它不是,代码也可以简单地创建另一个具有不同刷新模式的会话。

我认为合适的解决方案是建议只读session.FlushMode = FlushMode.Never强制执行,方法是使用只有SELECT权限的数据库连接(或任何适合您情况的东西)。维护单独的ISessionFactory工厂可能有助于允许ReadOnlySessionFactory.Create()

之类的东西

答案 1 :(得分:6)

查看NHibernate 3.1 GA中可用的只读实体 https://nhibernate.jira.com/browse/NH-908

答案 2 :(得分:1)

NHibernate中有一个更新的只读功能(我不知道哪个版本,但它确实在3.3.0中)。您可以将会话设置为只读:

session.DefaultReadOnly = true

它会禁用旧值的缓存,从而提高性能和内存消耗。

chapter about read-only entities中有一个NHibernate reference documentation

答案 3 :(得分:0)

累积更新,永远不会刷新对我来说似乎是一个糟糕的解决方案。 我发布了类似的问题。提供的解决方案使用不同的方法。所有事件都设置为空,因此被忽略。我的感觉是这是一种更好的方法。

我很惊讶这不容易做到。我喜欢使用扩展方法的实体框架方法.AsNoTracking()确保只读查询保持这种方式。

How to create an NHibernate read-only session with Fluent NHibernate that doesn't accumulate updates?