Я получил версию NH и FNH. Когда я пытаюсь добавить кэш второго уровня, некоторые части 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 => ................);
Ошибка запроса вызывает ошибку (предложение WITH
было добавлено в mssql2008):
Запрос должен начинаться с "SELECT" или "SELECT DISTINCT"
[NotSupportedException: запрос должен начинаться с "SELECT" или "SELECT DISTINCT" ] NHibernate.Dialect.MsSql2000Dialect.GetAfterSelectInsertPoint(SqlString sql) +179 NHibernate.Dialect.MsSql2000Dialect.GetLimitString(SqlString querySqlString, смещение Int32, предел Int32) +119 NHibernate.Dialect.MsSql2005Dialect.GetLimitString(SqlString querySqlString, Int32 offset, Int32 last) +127 NHibernate.Loader.Loader.PrepareQueryCommand(QueryParameters queryParameters, булевский свиток, сеанс ISessionImplementor) +725 NHibernate.Loader.Loader.DoQuery(сеанс ISessionImplementor, QueryParameters queryParameters, логические returnProxies) +352 NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(сеанс ISessionImplementor, QueryParameters queryParameters, Boolean returnProxies) +114 NHibernate.Loader.Loader.DoList(сеанс ISessionImplementor, QueryParameters queryParameters) +205
Любые идеи, что именно смущает 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)
вызывает это. К счастью, я могу развязать этот запрос.
Надеюсь, это исправит это.