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 查询
Argument data type text is invalid for argument 1 of replace function