C# 使用NHibernate的子类;获取NHibernate.ErrorClassException(有时)

C# 使用NHibernate的子类;获取NHibernate.ErrorClassException(有时),c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,WinForms应用程序、NHibernate v3.3.x、.Net 4、Windows 7(32位)、Oracle 10g后端 我们正在使用一个带有AuditTrail表的遗留数据库,其中列操作类型(AKTIONSCODE)控制附加(可选)参数(Para1-Para4)的含义 我已经创建了一个相应的类AuditTrail; 以及派生的子类,如auditTrailasRuleSetState和AuditTrailTestSpecSetState,其唯一目的是为公共参数获取一些好的getter和

WinForms应用程序、NHibernate v3.3.x、.Net 4、Windows 7(32位)、Oracle 10g后端

我们正在使用一个带有
AuditTrail
表的遗留数据库,其中列操作类型(AKTIONSCODE)控制附加(可选)参数(Para1-Para4)的含义

我已经创建了一个相应的类
AuditTrail
; 以及派生的子类,如
auditTrailasRuleSetState
AuditTrailTestSpecSetState
,其唯一目的是为公共参数获取一些好的getter和setter

插入条目工作正常

读取
auditTrailasRuleSetState
条目和其他派生类也可以正常工作

但有时我会在读取AuditTrailTestSpecSetState条目时收到NHibernate.ErrorClassException 关闭应用程序(可能关闭会话?)并再次读取相同的条目将再次工作

非常感谢你的建议

AuditTrail表和nHibernate映射文件如下所示:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MeCIS_DAL"
    namespace="Com.XY.App.DAL.Entities" >
<class name="AuditTrail" 
     table="AUDITTRAIL"  schema="MECIS_OWNER"
     dynamic-update="true" dynamic-insert="true" rowid="rowid">
<id name="AID" column="AID" unsaved-value="0">
  <generator class="native">
    <param name="sequence">mecis_owner.seq_audittrail</param>
  </generator>
</id>
<discriminator formula="case when aktionscode=20005 then '1' 
when aktionscode=20010 then '2' 
when aktionscode=20020 then '3' 
else '10' end" />

<property name="AuditTime" column="DATUM" not-null="true" />
<many-to-one name="User" class="Bearbeiter"
             fetch="join" cascade="none" not-null="true" >
  <column name="BEARBEITER_ID" />
</many-to-one>
<property name="HostName" column="RECHNER" length="15" />
<many-to-one name="AuditTrailDefObj" class="AuditTrailDef"
             fetch="join" cascade="none" not-null="true" >
  <column name="AKTIONSCODE" />
</many-to-one>
<property name="Para1" column="PARAMETER1" length="40" />
<property name="Para2" column="PARAMETER2" length="40" />
<property name="Para3" column="PARAMETER3" length="40" />
<property name="Para4" column="PARAMETER4" length="250" />

<subclass name="AuditTrailAsmRuleSetState" discriminator-value="1" entity-name="SetStateAsmRule">
  <!-- subclass specific properties -->
</subclass>

<subclass name="AuditTrailTestSpecObjSetState" discriminator-value="2" entity-name="SetStateTestSpecObj">
  <!-- subclass specific properties -->
</subclass>

<subclass name="AuditTrailTestSpecSetState" discriminator-value="3" entity-name="SetStateTestSpec">
  <!-- subclass specific properties -->
</subclass>

<subclass name="AuditTrail" discriminator-value="10" entity-name="BaseStd">
  <!-- subclass specific properties -->
</subclass>

      </class>
  <!--
 TABLE AUDITTRAIL
 Name                                      Null?    Type                        
 ===================================================================
 AID                                       NOT NULL NUMBER(11)
 DATUM                                     NOT NULL DATE
 BEARBEITER_ID                             NOT NULL NUMBER(5)
 RECHNER                                            VARCHAR2(15)
 AKTIONSCODE                               NOT NULL NUMBER(5)
 PARAMETER1                                         VARCHAR2(40)
 PARAMETER2                                         VARCHAR2(40)
 PARAMETER3                                         VARCHAR2(40)
 PARAMETER4                                         VARCHAR2(250)             
  -->
</hibernate-mapping>
AuditTrailTestSpecSetState:

public class AuditTrailTestSpecSetState : AuditTrail
{

    public virtual int Id
    {
        get
        {
            int n = int.Parse(this.Para1);
            return n;
        }
        protected set
        {
        }
    }

    public virtual TestSpecStates State
    {
        get
        {
            int n = int.Parse(this.Para2);
            return (TestSpecStates)n;
        }
    }

    public virtual string StateDesc
    {
        get
        {
            TestSpecStates rs = this.State;
            string s = rs.ToString();
            try 
            {
                s = DAL.RscMgr.GetString("TestSpecState_" + s, CultureInfo.CurrentCulture);
            }
            catch (Exception)
            {
                log.Error("StateDesc: no rsc for state " + this.State.ToString());
            }                
            return s;
        }
    }

    public virtual int StatusVal
    {
        get
        {
            return (int)this.State;
        }
    }
}
堆栈跟踪/日志记录: SQL语句似乎适合我

…Com.XY.App.mgmtool.TestSpecMgmtForm:ShowHistoryDataGrid
Com.XY.App.DAL.GenericDAOHibernate`2:GetTestSpecHistory id:1479
**NHibernate.SQL:2012-12-12 08:26:42488调试NHibernate.SQL:选择setstatete0.AID作为AID6,setstatete0.DATUM作为DATUM6,setstatete0.BEARBEITER作为BEARBEITER3,setstatete0.RECHNER作为RECHNER6,setstatete0.AKTIONSCODE作为aktions5,setstatete0.PARAMETER1作为参数6,SetState0.PARAMETER2作为参数6,将状态0参数3设置为参数8参数6,setstatete0.aktionscode=20005时,setstatete0.aktionscode=20010时为“1”,setstatete0.aktionscode=20020时为“2”,setstatete0.aktionscode=20020时为“3”,其余为“10”end='3'和setstatete0.aktionscode=:p1按SetState0.aktionscode排序。辅助说明:p0='1479'[类型:字符串(0)],:p1=20020[类型:Int32(0)]**
在NHibernate.dll aufgetreten中有一个典型的“NHibernate.ErrorClassException”。
在NHibernate.dll aufgetreten中有一个典型的“NHibernate.ErrorClassException”。
在NHibernate.dll aufgetreten中有一个典型的“NHibernate.ErrorClassException”。
在NHibernate.dll aufgetreten中有一个典型的“NHibernate.ErrorClassException”。
Com.XY.App.MgmtTool.TestSpecModel:2012-12-12 08:26:42754调试Com.XY.App.MgmtTool.TestSpecModel:GetTestSpecHistory失败!
**NHibernate.ErrorClassException:id为5436的对象不属于指定的子类:**SetStateTestSpec(加载对象属于错误的类[Com.XY.App.DAL.Entities.AuditTrail])
bei NHibernate.Loader.Loader.InstanceAlreadyLoaded(IDataReader rs、Int32 i、IEntityPersister persister、EntityKey、Object obj、LockMode LockMode、ISessionImplementor session)在p:\NHibernate core\src\NHibernate\Loader\Loader.cs:Zeile 896中。
p:\NHibernate core\src\NHibernate\Loader\Loader\Loader.GetRow(IDataReader rs,ILAdable[]持久化器,EntityKey[]键,对象optionalObject,EntityKey optionalObjectKey,LockMode[]锁定模式,IList HydreatedObject,ISessionImplementor会话)中的bei NHibernate.Loader.Loader.GetRow。
bei NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet,ISessionImplementor会话,QueryParameters QueryParameters,LockMode[]lockModeArray,EntityKey optionalObjectKey,IList HydreatedObject,EntityKey[]键,布尔返回代理)在p:\NHibernate core\src\NHibernate\Loader\Loader.cs:Zeile 342中。
p:\NHibernate core\src\NHibernate\Loader\Loader.DoQuery(ISessionImplementor会话、QueryParameters QueryParameters、Boolean returnProxies)中的bei NHibernate.Loader.Loader.DoQuery(ISessionImplementor会话、QueryParameters QueryParameters、Boolean returnProxies)。
bei NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor会话、QueryParameters QueryParameters、Boolean returnProxies)位于p:\NHibernate core\src\NHibernate\Loader\Loader.cs:Zeile 251中。
bei NHibernate.Loader.Loader.DoList(ISessionImplementor会话,QueryParameters QueryParameters)位于p:\NHibernate core\src\NHibernate\Loader\Loader.cs:Zeile 1569中。
bei NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor会话,QueryParameters QueryParameters)在p:\NHibernate core\src\NHibernate\Loader\Loader.cs:Zeile 1472中。
bei NHibernate.Loader.Loader.List(ISessionImplementor会话,QueryParameters QueryParameters,ISet`1 QuerySpace,IType[]结果类型)位于p:\NHibernate core\src\NHibernate\Loader\Loader.cs:Zeile 1467。
bei NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor会话,QueryParameters QueryParameters)位于p:\NHibernate core\src\NHibernate\Hql\Ast\ANTLR\Loader\QueryLoader.cs:Zeile 288中。
p:\NHibernate core\src\NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:Zeile 112中的bei NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor会话,QueryParameters QueryParameters)。
p:\NHibernate core\src\NHibernate\Engine\Query\HQLQueryPlan.PerformList(QueryParameters QueryParameters,ISessionImplementor session,IList results)中的bei NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters QueryParameters,ISessionImplementor session,IList results)。
p:\NHibernate core\src\NHibernate\Impl\SessionImpl.cs:Zeile 626中的bei NHibernate.Impl.SessionImpl.List(字符串查询、查询参数、查询参数、IList结果)。
p:\NHibernate core\src\NHibernate\Impl\SessionImpl.cs:Zeile 592中的bei NHibernate.Impl.SessionImpl.List(字符串查询,QueryParameters参数)。
p:\NHibernate core\src\NHibernate\Impl\QueryImpl.cs:Zeile 64中的bei NHibernate.Impl.QueryImpl.List()。
L:\App\DAL\daohbernate\testspecdaohbernate.cs:Zeile 55中的bei Com.XY.App.DAL.testspecdaohbernate.GetTestSpecHistory(Int32 id)。
L:\A中的bei Com.XY.App.MgmtTool.TestSpecModel.GetTestSpecHistory(Int32 id)
public class AuditTrailTestSpecSetState : AuditTrail
{

    public virtual int Id
    {
        get
        {
            int n = int.Parse(this.Para1);
            return n;
        }
        protected set
        {
        }
    }

    public virtual TestSpecStates State
    {
        get
        {
            int n = int.Parse(this.Para2);
            return (TestSpecStates)n;
        }
    }

    public virtual string StateDesc
    {
        get
        {
            TestSpecStates rs = this.State;
            string s = rs.ToString();
            try 
            {
                s = DAL.RscMgr.GetString("TestSpecState_" + s, CultureInfo.CurrentCulture);
            }
            catch (Exception)
            {
                log.Error("StateDesc: no rsc for state " + this.State.ToString());
            }                
            return s;
        }
    }

    public virtual int StatusVal
    {
        get
        {
            return (int)this.State;
        }
    }
}