我的Publisher系统才刚刚开始,又被一些问题给卡住了,不过在本人的机智聪明下都被一一化解(汗~~)。
Now,先来看看我又遇到了什么问题。
还是关于Nhibernate的,我用code Smith生成的Mapping文件和persistent Class似乎都有了问题,先来看看出问题的代码:
ICriteria
criteria = _session.CreateCriteria(typeof(ContentInfo));
criteria.Add(Expression.Eq("ModuleId", ModuleId));
IList
<ContentInfo> contentList = criteria.List<ContentInfo>();
我们先来看看代码有什么问题,ModuleId是一个String类型的变量,但是我在run的时候总是收到一个
Type mismatch in的Exception怎么回事呢??
Tracking程序进入到NHibernate的内部,发现异常抛出在以下的代码中:
if
(_value != null && !(_value is System.Type) && !propertyType.ReturnedClass.IsInstanceOfType(_value))
{
throw new QueryException(string.Format(
"Type mismatch in {0}: {1} expected type {2}, actual type {3}",
GetType(), _propertyName, propertyType.ReturnedClass, _value.GetType()));
}
关键是
propertyType.ReturnedClass.IsInstanceOfType(_value)这个
statement,此时我的_value是一个String类型的ModuleId而这个ModuleId又是一个many to one的field,它在Mapping file中的表示是:
<
many-to-one
name
=
"ModuleId"class="MyPublisher.Entities.ModuleInfo, Entities">
<
column
name
=
"ModuleId"length="50"sql-type="varchar"not-null="false"/>
</
many-to-one
>
看到了吧,并没有String类型的说明的,但是我在contentInfo这个persistent Class中又将ModuleId定义成了String。所以此时会抛出一个异常。
^_^问题的原因找到了,那就可以着手改了,很简单,将传入Criteria.add(Expression.Eq(“ModuleId”,ModuleId))中的ModuleId改成传入ModuleInfo(object of ModuleInfo class)。
然后再运行。。。。。。。
靠,从来就没有一帆风顺的事情,老子的程序又有问题了,这下又报了一个更加不知所谓的Exception: Unable to cast object of type CProxyTypeModuleInfo to System.String(可能有些出入,记错了,^_^ ,大概是这个样子的)。
同上,继续tracking,然后发现出错语句,就不细讲了,问题出在应该讲persistent class中的ModuleId field改成ModuleInfo类型。当然相关的部分也要做相应的修改。
基本上我总结,只要Mapping的时候出现many to one的field,在使用criteria的时候一定就要传入对象,而不能只是只传入具体的值。