NHibernate 抛出 NHibernate.Exceptions.GenericADOException 在 Fetch 请求期间无法更新

NHibernate throws NHibernate.Exceptions.GenericADOException can not update during Fetch request

我是 NHibernate 的新手,我正在编写一些代码来使用 NHibernate 提取请求从 table 中获取总记录数,代码如下所示:

 var query = request.RpcManager.Session.CreateCriteria(beanType);
 ......
 int totalRowCount = (int)query.UniqueResult<int>();

详细异常信息如下:

    NHibernate.Exceptions.GenericADOException was unhandled by user code
      HResult=-2146232832
      Message=could not update: [TestApi.DAO.AD_Window#125][SQL: UPDATE AD_WINDOW SET AD_CLIENT_ID = ?, AD_ORG_ID = ?, ISACTIVE = ?, CREATED = ?, CREATEDBY = ?, UPDATED = ?, UPDATEDBY = ?, NAME = ?, DESCRIPTION = ?, HELP = ?, WINDOWTYPE = ?, ISSOTRX = ?, ENTITYTYPE = ?, PROCESSING = ?, AD_IMAGE_ID = ?, AD_COLOR_ID = ?, ISDEFAULT = ?, WINHEIGHT = ?, WINWIDTH = ?, ISBETAFUNCTIONALITY = ? WHERE AD_WINDOW_ID = ?]
      Source=NHibernate
      SqlString=UPDATE AD_WINDOW SET AD_CLIENT_ID = ?, AD_ORG_ID = ?, ISACTIVE = ?, CREATED = ?, CREATEDBY = ?, UPDATED = ?, UPDATEDBY = ?, NAME = ?, DESCRIPTION = ?, HELP = ?, WINDOWTYPE = ?, ISSOTRX = ?, ENTITYTYPE = ?, PROCESSING = ?, AD_IMAGE_ID = ?, AD_COLOR_ID = ?, ISDEFAULT = ?, WINHEIGHT = ?, WINWIDTH = ?, ISBETAFUNCTIONALITY = ? WHERE AD_WINDOW_ID = ?
      StackTrace:
           at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
           at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
           at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session)
           at NHibernate.Action.EntityUpdateAction.Execute()
           at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
           at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
           at NHibernate.Engine.ActionQueue.ExecuteActions()
           at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
           at NHibernate.Event.Default.DefaultAutoFlushEventListener.OnAutoFlush(AutoFlushEvent event)
           at NHibernate.Impl.SessionImpl.AutoFlushIfRequired(ISet`1 querySpaces)
           at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
           at NHibernate.Impl.CriteriaImpl.List(IList results)
           at NHibernate.Impl.CriteriaImpl.UniqueResult[T]()
           ......
      InnerException: 
           Code=1407
           ErrorCode=-2146232008
           HResult=-2146232008
           Message=ORA-01407: cannot update ("COMPIERE"."AD_WINDOW"."CREATED") to NULL

           Source=System.Data.OracleClient
           StackTrace:
                at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
                at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
                at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor)
                at System.Data.OracleClient.OracleCommand.ExecuteNonQuery()
                at NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd)
                at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation expectation)
                at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
           InnerException: 

我是运行一个获取请求,所以我不明白为什么异常是关于更新的,请告诉我如何解决这个问题,谢谢。

我尝试使用如下代码:

request.RpcManager.Session.QueryOver<AD_Window>().RowCount();

但是遇到了同样的异常。

您在第一级(会话)缓存中有一个修改过的(或者,至少,NH 认为它被修改过,搜索 Google 是否有鬼)实体。在进行查询之前,NH 将尝试刷新所有内容。 如果您将 ISession 上的 FlushMode 设置为从不,您可能可以摆脱它,但真正的问题仍然存在。