NHibernate 3 使用 SQL Compact 4.0 和 FirstOrDefault() 抛出 NotSupportedException
Posted
技术标签:
【中文标题】NHibernate 3 使用 SQL Compact 4.0 和 FirstOrDefault() 抛出 NotSupportedException【英文标题】:NHibernate 3 throwing NotSupportedException with SQL Compact 4.0 and FirstOrDefault() 【发布时间】:2011-09-10 00:06:01 【问题描述】:我有一段相当简单的代码可以从数据库中检索对象。这似乎在 SQL Server 2008 上运行良好,但在 SQL Server Compact 上却失败了。 SQL Server CE 支持 TOP() - 这只是 NHibernate 3 中的一个错误吗?
代码:
public override Profile GetProfileByName(string name)
using (var tc = TC)
var query = from profiles in tc.Session.Query<Profile>()
where profiles.Name == name
select profiles;
Profile profile = query.FirstOrDefault();
tc.Commit();
return profile;
NHibernate 配置:
<property name="dialect">NHibernate.Dialect.MsSqlCeDialect</property>
<property name="connection.driver_class">NHibernate.Driver.SqlServerCeDriver</property>
例外:
System.NotSupportedException occurred
Message=Dialect does not support limits.
Source=NHibernate
StackTrace:
at NHibernate.Dialect.Dialect.GetLimitString(SqlString queryString, Nullable`1 offset, Nullable`1 limit, Parameter offsetParameter, Parameter limitParameter)
InnerException:
【问题讨论】:
【参考方案1】:您使用了错误的方言。使用MsSqlCe40Dialect
。
【讨论】:
我切换到 MsSqlCe40Dialect 并没有什么不同。 我刚刚试过你的代码,它工作正常。您使用的是最新版本(3.2 GA)吗?如果它“没有任何区别”,您可能忘记编译或部署,因为 MsSqlCe40Dialect 正是实现了这一功能(分页)。我知道,因为我是原作者 :-) 我有 NHibernate.dll 的 3.2.0.4000 版本,让我多尝试一下,并确保正在读取我对 config.xml 的更改。 有效!在再次测试之前,我一定没有将配置 xml 复制到输出文件夹。谢谢! (无论是为了您的回答,还是为了您的 NHibernate 贡献以首先支持它)【参考方案2】:对我来说 MsSqlCe40Dialect 不起作用,我必须在自定义方言中覆盖 SupportsVariableLimit 才能进行分页工作。
public class MyDialect : MsSqlCe40Dialect
public override bool SupportsVariableLimit
get
return true;
【讨论】:
以上是关于NHibernate 3 使用 SQL Compact 4.0 和 FirstOrDefault() 抛出 NotSupportedException的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate.Spatial 和 Sql 2008 地理类型 - 如何配置
使用 QueryOver 与 NHibernate 进行内部连接的 SQL 查询
将 Linq 中的 NHibernate 应用程序重写为 SQL
如何使用 DISTINCT 在 NHibernate SQL 查询中进行分页