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() - 这只是 NH​​ibernate 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 查询中进行分页

将 GUID 与 SQL Server 和 NHibernate 一起使用

nHibernate 生成了这个奇怪的 SQL; SQLS 是不是按原样使用它?