当CacheMode = Ignore时,为什么NHibernate.ISession.CreateQuery会返回与CreateSQLQuery不同的东西?

时间:2011-12-09 18:01:34

标签: c# nhibernate

这是一个非常简单的问题,但我对它感到困惑。在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 个答案:

答案 0 :(得分:1)

这样的事情可能有多种原因,请检查您的映射是否有以下内容:

  • 使用<class>过滤器进行where映射。
  • <discriminator> force="true"属性。
  • <join>映射在一侧不匹配且未指定为optional="true"
  • 该实体的自定义<loader query-ref="...">
  • 已通过<filter>启用的实体上的session.EnableFilter
  • Protein未映射到Protein表。
  • 您可以在不同的模式中有2个名为Protein的表,因此NHibernate正在查询foo.Protein,但您的sql正在查询dbo.Protein

之后它开始变得更加深奥,例如使用自定义方言,实体tuplizer等。

查看正在发生的事情的一种简单方法是查看正在发布的SQL,您可以通过以下方式执行此操作:

  • 设置<property name="show_sql" value="true"/>并观看控制台/记录器。
  • 为服务器使用配置文件工具(例如,用于MSSQL的SQL Server Profiler)。
  • 使用NHibernate Profiler