【问题标题】:NHibernate LINQ query throws error "Could not resolve property"NHibernate LINQ 查询抛出错误“无法解析属性”
【发布时间】:2010-05-06 19:03:05
【问题描述】:

我正在使用带有 NHibernate 的 LINQ 进行测试,但在解析 string.length 时遇到了一些问题。我有以下

public class DC_Control
{
    public virtual int ID { get; private set; }
    public virtual string Name { get; set; }
    public virtual bool IsEnabled { get; set; }
    public virtual string Url { get; set; }
    public virtual string Category { get; set; }
    public virtual string Description { get; set; }
    public virtual bool RequireScriptManager { get; set; }
    public virtual string TriggerQueryString { get; set; }
    public virtual DateTime? DateAdded { get; set; }
    public virtual DateTime? DateUpdated { get; set; }
}

public class DC_ControlMap : ClassMap<DC_Control>
{
    public DC_ControlMap()
    {
        Id(x => x.ID);
        Map(x => x.Name).Length(128);
        Map(x => x.IsEnabled);
        Map(x => x.Url);
        Map(x => x.Category);
        Map(x => x.Description);
        Map(x => x.RequireScriptManager);
        Map(x => x.TriggerQueryString);
        Map(x => x.DateAdded);
        Map(x => x.DateUpdated);
    }
}

private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008)
            .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
            .ExposeConfiguration(c => c.SetProperty("connection.connection_string", "CONNSTRING"))
            .ExposeConfiguration(c => c.SetProperty("proxyfactory.factory_class", "NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle"))
            .BuildSessionFactory();
    }

public static void test()
    {
        using (ISession session = sessionFactory.OpenSession())
        {
            var sqlQuery = session.CreateSQLQuery("select * from DC_Control  where  LEN(url) > 80").AddEntity(typeof(DC_Control)).List<DC_Control>();

            var linqQuery= session.Linq<DC_Control>().Where(c => c.Url.Length > 80).ToList();
        }
    }

在我的测试方法中,我首先尝试使用 SQL 执行查询,这很好用。然后我想在LINQ中做同样的事情,它会抛出以下错误:

NHibernate.QueryException: could not resolve property: Url.Length of: DC_Control

我已经搜索了很多关于“无法解析属性”的错误,但我不太明白这是什么意思。这是因为 LINQ 实现不完整吗?如果是这样,那么来自 Linq2Sql 的情况会有点令人失望。

我还尝试使用 hbm.xml 设置映射,而不是使用 FluentNHibernate,但它产生了同样的错误。

【问题讨论】:

标签: linq nhibernate fluent-nhibernate


【解决方案1】:

旧的 (2.x) Linq 提供程序不支持 String.Length 投影。

NHibernate 3.x 中新的 Linq 提供程序已集成;您无需额外下载任何内容。

新的扩展方法是session.Query,而不是session.Linq;如果您使用的是后者,那么您仍在使用旧的提供程序。

【讨论】:

  • 太棒了!我刚刚从后备箱中下载了最新版本,它工作正常。所以是的,肯定会出现在 NHibernate 3.x 中,那就等着吧。
  • NH 3 或多或少已准备好生产。无需等待正式发布。
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多