Почему NHibernate.ISession.CreateQuery возвращает что-то отличное от CreateSQLQuery, когда CacheMode = Ignore? - PullRequest
0 голосов
/ 09 декабря 2011

Это довольно простой вопрос, но я сбит с толку этим. В ближайшем окне 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 Ответ

1 голос
/ 10 декабря 2011

Может быть несколько причин для чего-то подобного, проверьте следующее:

  • A <class> с фильтром where.
  • A <discriminator> с атрибутом force="true".
  • A <join> отображение, которое не совпадает на одной стороне и не указано как optional="true".
  • Пользовательский <loader query-ref="..."> для сущности.
  • A <filter> на объекте, включенном через session.EnableFilter.
  • Класс Protein не сопоставлен с таблицей Protein.
  • Вы можете иметь 2 таблицы с именем Protein в разных схемах, поэтому NHibernate запрашивает foo.Protein, а ваш sql запрашивает dbo.Protein.

После этого он начинает становиться все более эзотерическим, например, используя собственные диалекты, тупилизаторы сущностей и т. Д.

Один простой способ увидеть, что происходит - посмотреть на выдаваемый SQL, вы можете сделать это:

  • Настройка <property name="show_sql" value="true"/> и просмотр консоли / регистратора.
  • Использование инструмента профилирования для вашего сервера (например, SQL Server Profiler для MSSQL).
  • Использование NHibernate Profiler
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...