Я получил багажную версию NH и FNH.Когда я пытаюсь добавить кэш 2-го уровня, некоторые части NHibernate забывают о выбранном sqldialect.
Начальная конфигурация:
var cfg = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(connectionString)
.DefaultSchema("dbo")
.UseReflectionOptimizer()
.Mappings(m => ................);
Виновный пользовательский запрос:
var sql = @"with Foo(col1,col2,col3)
as (select bla bla bla...)
Select bla bla bla from Foo";
list = Session.CreateSQLQuery(sql)
.AddEntity("fizz", typeof(Fizz))
.SomethingUnimportant();
Когда я изменяю конфигурацию на:
var cfg = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(connectionString)
.DefaultSchema("dbo")
.UseReflectionOptimizer()
.Cache(c=>c
.UseQueryCache()
.ProviderClass<HashtableCacheProvider>())
.ShowSql())
.Mappings(m => ................);
Ошибка выброса запроса (в mssql2008 было добавлено предложение WITH
):
Запрос должен начинаться с «SELECT» или «SELECT DISTINCT '
[NotSupportedException: запрос должен начинаться с' SELECT 'или' SELECT DISTINCT '] NHibernate.Dialect.MsSql2000Dialect.GetAfterSelectInsertPoint (SqlString sql) +179 NHibernate.Dialect.MsSitStiaSqringSlringLDLRQСмещение Int32, ограничение Int32) +119 NHibernate.Dialect.MsSql2005Dialect.GetLimitString (SqlString querySqlString, Int32 смещение, Int32 последнее) +127 NHibernate.Loader.Loader.PrepareQueryCommand (QueryParameters queryParameters, sessionlemple).Loader.DoQuery (сеанс ISessionImplementor, QueryParameters queryParameters, Boolean returnProxies) +352 NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections (сеанс ISessionImplementor, QueryParameters queryParameters, логическое returnProxies) +114 NHibernate.Loader.Loader.1022 * Есть идеи, что именно смущает nhibernate и как его исправить?
Виновный код NHibernate (в NHibernate / Dialect / MsSql200Dialect.cs):
private static int GetAfterSelectInsertPoint(SqlString sql)
{
if (sql.StartsWithCaseInsensitive("select distinct"))
{
return 15;
}
else if (sql.StartsWithCaseInsensitive("select"))
{
return 6;
}
throw new NotSupportedException
("The query should start with 'SELECT' or 'SELECT DISTINCT'");
}
}
Видит, что .SetMaxResults(123)
вызывает это.К счастью, я могу отменить этот запрос.
Надеюсь, это исправит это.