我买的是 NH 和 FNH 的后备箱版本。当我尝试添加二级缓存时,NHibernate 的某些部分忘记了所选的 sql 方言。
初始配置:
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 偏移量, Int32 最后) +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,布尔returnProxies)+114
NHibernate.Loader.Loader.DoList(ISessionImplementor 会话,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)
导致这种情况。幸运的是,我可以解除该查询的绑定。
希望这能解决这个问题。