遭遇: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

 
前台是如此绑定:

                    <asp:BoundField  DataField="Name" HeaderText="部门名称" />

 

分析了原因,原来是Eval("Name")执行时,应该会把列表的第一个类型反射,以后都用这个类型,而第一个和第二个类型分别是:

类型   
CProxyTypeGrain_ComponentsDicDeptComponents_NHibernate_ProxyINHibernateProxy1 
Grain.Components.DicDept

 
在我的项目中,第二个是我的类,第一个明显是Hibernate的代理类,是DicDept的子类.所以报错是肯定的了.反之,如果第一个节点是DicDept,然后才是代理类,则不会出现错误.

为什么会发生如此的事情呢?我想可能是因为当前登陆用户的部门属于列表中的第一项,所以每次登陆,这个对象都会加载进来,从而在列表时,这个对象会从缓存中直接加载.

看来,我们要在进行查询时,对缓存中的对象进行一下清理,这样就排除了从缓冲中直接取数据,导致类型不一致的问题.

                Database.Session.Clear(); //先清除缓存
                list.AddRange(DicDept.TopDicDeptList());

 好了,现在问题解决了,不过我得考虑一下,是不是每次进行查询前都要进行清理呢?又在哪里进行清理呢?

 

 

posted @ 2008-12-03 09:19  阿牛  阅读(6547)  评论(0编辑  收藏  举报