遭遇:TargetException: 对象与目标类型不匹配。
最近在使用NHibernate时,发现有的列表无法绑定,如提示如下的错误:
[TargetException: 对象与目标类型不匹配。]
System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target) +7515851
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +105
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +29
System.ComponentModel.ReflectPropertyDescriptor.GetValue(Object component) +100
[TargetInvocationException: 对象“Grain.Components.DicDept”上的属性访问器“Name”发生以下异常: “对象与目标类型不匹配。”]
System.ComponentModel.ReflectPropertyDescriptor.GetValue(Object component) +390
System.Web.UI.WebControls.BoundField.GetValue(Control controlContainer) +192
System.Web.UI.WebControls.BoundField.OnDataBindField(Object sender, EventArgs e) +64
System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target) +7515851
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +105
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +29
System.ComponentModel.ReflectPropertyDescriptor.GetValue(Object component) +100
[TargetInvocationException: 对象“Grain.Components.DicDept”上的属性访问器“Name”发生以下异常: “对象与目标类型不匹配。”]
System.ComponentModel.ReflectPropertyDescriptor.GetValue(Object component) +390
System.Web.UI.WebControls.BoundField.GetValue(Control controlContainer) +192
System.Web.UI.WebControls.BoundField.OnDataBindField(Object sender, EventArgs e) +64
前台是如此绑定:
<asp:BoundField DataField="Name" HeaderText="部门名称" />
分析了原因,原来是Eval("Name")执行时,应该会把列表的第一个类型反射,以后都用这个类型,而第一个和第二个类型分别是:
类型
CProxyTypeGrain_ComponentsDicDeptComponents_NHibernate_ProxyINHibernateProxy1
Grain.Components.DicDept
CProxyTypeGrain_ComponentsDicDeptComponents_NHibernate_ProxyINHibernateProxy1
Grain.Components.DicDept
在我的项目中,第二个是我的类,第一个明显是Hibernate的代理类,是DicDept的子类.所以报错是肯定的了.反之,如果第一个节点是DicDept,然后才是代理类,则不会出现错误.
为什么会发生如此的事情呢?我想可能是因为当前登陆用户的部门属于列表中的第一项,所以每次登陆,这个对象都会加载进来,从而在列表时,这个对象会从缓存中直接加载.
看来,我们要在进行查询时,对缓存中的对象进行一下清理,这样就排除了从缓冲中直接取数据,导致类型不一致的问题.
Database.Session.Clear(); //先清除缓存
list.AddRange(DicDept.TopDicDeptList());
list.AddRange(DicDept.TopDicDeptList());
好了,现在问题解决了,不过我得考虑一下,是不是每次进行查询前都要进行清理呢?又在哪里进行清理呢?
QQ:273352165
evlon#126.com
转载请注明出处。