簡體   English   中英

當CacheMode = Ignore時,為什么NHibernate.ISession.CreateQuery返回與CreateSQLQuery不同的東西?

[英]Why would NHibernate.ISession.CreateQuery return something different from CreateSQLQuery when CacheMode=Ignore?

這是一個非常簡單的問題,但我對此感到困惑。 在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

可能有多種原因導致這種情況,請檢查以下映射:

  • 具有where過濾器的<class>映射。
  • 具有force="true"屬性的<discriminator>
  • 一側不匹配且未指定為optional="true"<join>映射。
  • 實體的自定義<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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM