【问题标题】: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

【问题讨论】:

    标签: c# nhibernate


    【解决方案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

    【讨论】:

    • 连接映射不是可选的。我没有意识到可选是内连接和左外连接之间的区别。我什至阅读了上面的文档,但不理解“将始终使用外部连接来检索属性”。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 2019-09-03
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多