NHibernate Invalid Cast - 使用查询时属性类型不匹配

Posted

技术标签:

【中文标题】NHibernate Invalid Cast - 使用查询时属性类型不匹配【英文标题】:NHibernate Invalid Cast - Property type mismatches when using queries 【发布时间】:2014-03-13 13:25:21 【问题描述】:

在阅读了几个类似的问题几个小时后,我仍然无法找到我遇到的问题。查询中出现异常,如下:

    Configuration config = new Configuration();
    config.AddAssembly(typeof(TestCase).Assembly);
    ISessionFactory sessionFactory = config.BuildSessionFactory();
    var session = sessionFactory.OpenSession();
    ICriteria targetObjects = session.CreateCriteria(typeof(TestCase));
    IList<TestCase> itemList = targetObjects.List<TestCase>(); //Exception raised here

例外是“无效的演员表(检查您的映射是否有属性类型不匹配);TestProject.TestCase 的设置器”

InnerException "Specified cast is not valid."

这个类如下:

    public virtual Guid Id                get; set; 
    public virtual ushort Priority        get; set; 
    public virtual string Description     get; set; 
    public virtual IList<string> Project  get; set; 
    public virtual string Name            get; set; 
    public virtual DateTime? Created      get; set; 
    public virtual DateTime? Updated      get; set; 

而映射文件是

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       assembly="TestProject"
                       namespace="TestProject">
      <class name="TestCase"
             table="test_table"
             lazy="true">
        <id name="Id" column="ID" type="Guid">
          <generator class="assigned" />
        </id>
        <property name="Priority" column="Priority"
                  type="int" />
        <property name="Description" column="Description"
                  type="string" />
        <property name="Name" column="Name"
                  type="string" />
        <property name="Created" column="Created"
                  type="DateTime" />
        <property name="Updated" column="Updated"
                  type="DateTime" />
        <list table="ProjTable" name="Project">
          <key column="TestID" />
          <list-index column="ProjIndex" />
          <element column="ProjCol" />
        </list>
     </class>
    </nhibernate-mapping>

我对 SQL 不太熟悉,但它在过去帮助我调试了这个项目,所以我将发布生成的内容:

    NHibernate: SELECT this_.ID as ID0_0_, this_.Priority as Priority0_0_,
    this_.Description as Descript4_0_0_, this_.Test_Name as Test5_0_0_, 
    this_.Created as Created0_0_, this_.Updated as Updated0_0_ FROM test_table this_

我已经能够使用此映射将值加载到表中,但我无法使用任何类型的查询而不发现此错误。我自己看了看,似乎找不到原因。

我尝试过的: -不同的查询 -更改日期时间?到 DateTime(在某处将其作为可能的解决方案阅读) - 玩弄发生异常的行的结构

我们将不胜感激任何帮助,因为在过去的几天里,我已经在这个和类似的基本问题上停留了几个小时。

【问题讨论】:

TestProject.TestCase 是实际名称,还是您为问题重命名了它们?我问是因为感觉问题中的某些内容不太正确。你有namespace="TestProject.TestCase",还有class name="TestProject.TestCase",还有一个错误,说明了一个名为TestProject.TestCase的属性。所以所有三个 - 命名空间、类和属性的名称完全相同。要么这是你的问题,要么是你陈述问题的方式有误。 这就是他们的名字;根据我在设置过程中收集的其他信息,这似乎是正确的做法。不过,我会看看这是否能解决问题。谢谢! 这似乎没有解决任何问题,但我确实清理了一点 XML,它仍然可以将数据插入表中。我已经相应地更新了主帖中的 XML。当我再次查看代码时,我对在其他地方注意到的一些差异进行了一些其他测试,但它们也没有完成任何事情。我会继续努力的。再次感谢您的意见! 【参考方案1】:

找到了解决方案,我不知道为什么我之前没有考虑过。

通过从 .hbm.xml 中删除类型,它可以让查询不受阻碍地通过。经过更多测试后,我得出结论,Priority 列对成为 int 或 uint 并不满意。我认为这是 mysql 如何存储整数与 C# 相比的问题,很可能是因为我在数据库端将它们标记为无符号。作为修复,我只是从 XML 中删除了该类型。

【讨论】:

以上是关于NHibernate Invalid Cast - 使用查询时属性类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 将 sql 查询转换为 NHibernate QueryOver 查询

让 Google Cast v3 在不受支持的设备上运行

Argument data type text is invalid for argument 1 of replace function

默认命名空间在 chromecast 接收器中调用

NHibernate之旅系列文章导航

Nhibernate学习教程-- 第一个NHibernate程序