2011-12-09 9 views
0

これはかなり簡単な質問ですが、私はそれに困惑しています。 Visual Studioののイミディエイトウィンドウでは、私はこれを参照してください。なぜ、NHibernate.ISession.CreateQueryは、CacheMode = IgnoreのときにCreateSQLQueryと異なる何かを返しますか?

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>マッピング。
  • <discriminator>force="true"属性です。
  • <join>マッピングが片側で一致せず、optional="true"として指定されていません。エンティティのためのカスタム<loader query-ref="...">
  • session.EnableFilterによって有効にされたエンティティ上の<filter>
  • クラスProteinは、Proteinテーブルにマップされていません。
  • 異なるスキーマにProteinという2つのテーブルがある可能性があります。そのため、NHibernateはfoo.Proteinをクエリしていますが、SQLはdbo.Proteinにクエリしています。何が起こっているかを見るために

それは、このようなカスタムの方言、エンティティのTuplizerにを使用するなど、より難解な取得を開始した後、など

1つの簡単な方法は、発行されたSQLを見ている、あなたが行うことができますこれは、

  • を設定し、コンソール/ロガーを監視します。
  • サーバー用のプロファイリングツールを使用します(例:MSSQLのSQL Server Profiler)。
  • 使用NHibernate Profiler
+0

結合マッピングはオプションではありませんでした。私は、内側の結合と左側の外側の結合の違いはオプションではないことを理解していませんでした。私はそれについての文書を読むことさえできますが、「常に外部結合を使ってプロパティを取得します」と理解していませんでした。ありがとう! –

関連する問題