当 CacheMode=Ignore 时,为啥 NHibernate.ISession.CreateQuery 会返回与 CreateSQLQuery 不同的东西?
Posted
技术标签:
【中文标题】当 CacheMode=Ignore 时,为啥 NHibernate.ISession.CreateQuery 会返回与 CreateSQLQuery 不同的东西?【英文标题】:Why would NHibernate.ISession.CreateQuery return something different from CreateSQLQuery when CacheMode=Ignore?当 CacheMode=Ignore 时,为什么 NHibernate.ISession.CreateQuery 会返回与 CreateSQLQuery 不同的东西? 【发布时间】:2011-12-09 18:01:33 【问题描述】:这是一个非常简单的问题,但我对此感到困惑。在 Visual Studio 的即时窗口中,我看到了这个:
session.CacheMode
Ignore
session.CreateQuery("SELECT COUNT(*) FROM Protein").List()
Count = 1
[0]: 0
session.CreateSQLQuery("SELECT COUNT(*) FROM Protein").List()
Count = 1
[0]: 6
【问题讨论】:
【参考方案1】:这种情况可能有多种原因,请检查您的映射以了解以下情况:
带有where
过滤器的<class>
映射。
带有force="true"
属性的<discriminator>
。
<join>
映射在一侧不匹配且未指定为 optional="true"
。
实体的自定义<loader query-ref="...">
。
已通过session.EnableFilter
启用的实体上的<filter>
。
Protein
类未映射到 Protein
表。
您可以在不同的架构中有 2 个名为 Protein
的表,因此 NHibernate 正在查询 foo.Protein
,但您的 sql 正在查询 dbo.Protein
。
之后它开始变得更加深奥,例如使用自定义方言、实体元组等。
查看正在发生的事情的一种简单方法是查看正在发出的 SQL,您可以通过以下方式执行此操作:
设置<property name="show_sql" value="true"/>
并观察控制台/记录器。
为您的服务器使用分析工具(例如用于 MSSQL 的 SQL Server Profiler)。
使用NHibernate Profiler
【讨论】:
连接映射不是可选的。我没有意识到可选是内连接和左外连接之间的区别。我什至阅读了上面的文档,但不理解“将始终使用外部连接来检索属性”。谢谢!以上是关于当 CacheMode=Ignore 时,为啥 NHibernate.ISession.CreateQuery 会返回与 CreateSQLQuery 不同的东西?的主要内容,如果未能解决你的问题,请参考以下文章
为啥“grep --ignore-case”慢了 50 倍?
何时以及为啥需要在 C++ 中使用 cin.ignore()?
jquery.validate 当验证正确之后为啥错误信息没有移除?
为啥当我单击 Ctrl+Shift+N 时 resharper 无法打开文件?
从命令行运行脚本时忽略 sklearn Gridsearch 中 n_jobs = -1 的警告不使用 warnings.simplefilter('ignore')