Fluent NHibernate 禁用缓存

Posted

技术标签:

【中文标题】Fluent NHibernate 禁用缓存【英文标题】:Fluent NHibernate Disable Cache 【发布时间】:2017-05-29 17:45:31 【问题描述】:

我在 Fluent NHibernate 中遇到缓存问题。我想禁用它以通过 ID 进行查询,例如

session.Get<Person>(10);

你有什么想法吗?

【问题讨论】:

如果您能再解释一下您遇到的问题,那就太好了。 您可能会问如何将错误的解决方案应用于您的实际问题。 【参考方案1】:

您指的是一级(会话)缓存吗? 您可以使用 Refresh 从数据库中刷新实体的状态,即:

// Will get the state from the first-level cache if already present in the session:
var entity = Session.Get<EntityType>(entityId);

// Line below will update the entity with the current state from the database:
Session.Refresh(entity);

【讨论】:

如果实体尚未在缓存中,这将导致对数据库进行两次查询。 确实如此。我相信如果情况像上面那样(您没有对要刷新的实体的引用),可以使用 Session.Load 而不是 Session.Get 来避免这种情况。【参考方案2】:

如果您已经持有该实体,请直接致电session.Refresh(person),而不是再次获取它。

您也可以使用session.Evict(person) 驱逐它,使其不再出现在会话中,也不再跟踪更改。然后丢弃它,如果你需要,最终再得到它。

否则,从会话缓存中获取它是一个麻烦,这是不寻常的。这通常是会话使用不当的标志,例如在许多用户交互中使用同一个会话(反模式)。

你仍然可以做Fredy proposes。或者在获取清除会话缓存之前调用session.Clear()(顺便丢失所有挂起的更改)。

【讨论】:

【参考方案3】:

您可以为 Person 创建一个 DTO 并执行 QueryOver(),而不是映射的 Person 对象。

PersonDTO 对象不会被缓存在 Nhibernates first-lvl-cache 中。

【讨论】:

以上是关于Fluent NHibernate 禁用缓存的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 2 + Fluent Nhibernate 中等信任

NHibernate + Fluent NHibernate 异常

用 Fluent Nhibernate 定义 NHibernate 过滤器的语法?

Fluent NHibernate and Mysql,SQLite

Fluent NHibernate - NHibernate.QueryException:无法解析属性

Fluent Nhibernate and Stored Procedures