NHibernate & Linq - “无法解析属性”

Posted

技术标签:

【中文标题】NHibernate & Linq - “无法解析属性”【英文标题】:NHibernate & Linq - "could not resolve property" 【发布时间】:2010-12-08 09:45:34 【问题描述】:

映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="DaVinci"
               namespace="DaVinci.Domain">
  <class name="Waehrungskurs" table="WAEHRUNGSKURSE">
    <id name="Id" column="ID">
      <generator class="native" />
    </id>
    <property name="ISOCode" column="ISO" />
    <property name="AktuellerKurs" column="AKTKURS" />
    <property name="Kursart" column="KIND_OF_KURS" />
    <property name="WährungstabkurseId" column="WAEHRUNGSTABKURSE_ID" />
    <property name="Departure" column="DEPARTURE" />
    <property name="Datum" column="DATE_TIME" />
    <property name="RealerKurs" column="REALKURS" />
    <property name="Gültig" column="GUELTIG" />    
  </class>
</hibernate-mapping>

Domain.cs: ... 公共虚拟双 AktuellerKurs 得到;放; 公共虚拟日期时间基准获取;设置; 公共虚拟日期时间 Gültig 获取;放; 公共虚拟 int Id 获取;放; 公共虚拟字符串 ISOCode 获取;放; 公共虚拟 int Kursart 获取;放; 公共虚拟双 RealerKurs 得到;放; 公共虚拟 int WährungstabkurseId 获取;放; ...

当我调用以下函数时,我得到一个 NHibernate.QueryException(“无法解析属性:Datum.Date:DaVinci.Domain.Waehrungskurs”):

    public static Domain.Waehrungskurs GetByISOAndKursartAndDate(string isocode, int kursart, DateTime datum)
                

        return (from WK in session.Linq<DaVinci.Domain.Waehrungskurs>()                    
                where WK.ISOCode == isocode
                            &&
                      WK.Kursart == kursart
                            &&
                      WK.Datum.Date == datum.Date
                orderby WK.Id descending
                select WK).First();
    

当我删除搜索条件“WK.Datum.Date == datum.Date”时,该函数工作正常。

任何想法为什么找不到该属性?

【问题讨论】:

【参考方案1】:

没有找到日期时间的日期属性,因为它没有实现。请为this class写补丁

【讨论】:

这是一个非常明显的遗漏,因为这些函数可以通过调用框架中的函数来轻松实现。我没有抱怨,我已经为该文件的每个函数编写了一个补丁,所有的文本内容,加上我添加了 DayOfWeek、DayOfYear 和 Date。如何提交? @Gareth Farrington:太好了!也许您可以将其作为颠覆补丁提交给 NHibernate.Linq 的作者? 我刚刚更新了我们项目的所有库(Nhibernate/ActiveRecord),我看到 Linq 现在是 NHibernate 核心的一部分。我为其编写补丁的文件甚至不存在于新代码中。使用新代码进行的测试表明此问题尚未修复。来自 Select 子句的访问有效,但来自 GroupBy 的访问无效。我们决定只修改我们的表格。我们正在为需要对其进行分组/where 子句的日期添加日/月/年整数列。它只是不那么痛苦,可能更高效。我不确定我应该如何从这里开始。 NHcorelinq != NHcontrib linq 主干中的 linq 提供程序是一个全新的 linq 提供程序,与 NHcontrib 中的 linq 提供程序不同。老的provider稍微稳定了一点,最基本的功能都实现了。新的 linq 提供者将是一个完整的 linq 提供者,并将最终在 HQL 中实现所有内容。旧提供程序基于标准。在新的 linqprovider 完成之前,我还会对 NHcontrib 提供程序使用解决方法。 我简直不敢相信......为什么他们会错过这么有用的东西?【参考方案2】:

该属性不存在。

尝试替换:WK.Datum.Date == datum.Date

WK.Datum == datum.Date

【讨论】:

以上是关于NHibernate & Linq - “无法解析属性”的主要内容,如果未能解决你的问题,请参考以下文章

不支持 linq to nhibernate compareto

彻底检查电子邮件是不是存在,NHibernate,LINQ

NHibernate - 使用 LINQ 选择随机记录数

如果我使用类似 NHibernate 的 ORM,为啥需要 LINQ?

NHibernate3剖析:Query篇之NHibernate.Linq增强查询

我在哪里可以获得用于 NHibernate 的 Linq?