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