我正在使用Repo模式,我已经设置了测试来复制我的HTTP请求,然后在测试完成后对一个工作单元进行处理。
在执行HQL语句之后,然后调用displose(进而调用flush),它会导致各个元素之间的更新。
非常古怪 - 有没有人遇到过这个?
这是我的HQL语句及其执行:
_session.CreateQuery("select distinct t from TaskEntity as t").List<T>()
我已将其恢复为最简单的形式 - 请注意HQL语句不直接在CreateQuery中。
这是我得到的堆栈跟踪:
我
BM.Data.Informix.IfxParameterCollection.b(Int32 A_0)
IBM.Data.Informix.IfxParameterCollection.GetParameter(Int32 index)
System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index)
NHibernate.Type.Int32Type.Set(IDbCommand rs, Object value, Int32 index)
NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index)
NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session)
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)
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)
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)
NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session)
NHibernate.Action.EntityUpdateAction.Execute()
NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
NHibernate.Engine.ActionQueue.ExecuteActions()
NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
NHibernate.Impl.SessionImpl.Flush()
Case.Data.SQL.NHibernateUnitOfWork.Dispose() in C:\Projects\Case System\Dev\WorkingBranch\Src\Case.Data.SQL\NHibernateUnitOfWork.cs: line 46
Case.Domain.Tests.TaskServicesTests.TakeDown() in C:\Projects\Case System\Dev\WorkingBranch\Src\Case.Domain.Tests\TaskServicesTests.cs: line 40
答案 0 :(得分:4)
我遇到了类似的问题。我先告诉你是什么原因引起的。当NHibernate
从DB
获取实体时,它会将值分配给它的道具。很少有道具在DB
中具有空值但在类定义中不属于Nullable
类型。所以NHibernate
为它们分配一个默认值,例如。 0
的{{1}},int
的{{1}}等。当您在事务上调用commit时,DateTime.MinValue
会使用datetime
值重新检查属性的值并且由于应该具有NHibernate
值的道具现在具有默认值,DB
认为值已更改并导致更新。
<强>解决方案:强>
Null
通过帖子修复它们来为您的类道具
NHibernate
但对我而言,这会导致其他问题。nullable datatypes
类型,但这不是首选
大多数情况。?
值
在Not Null
Null
中保存了一些默认值,这会停止
要求进行不必要的更新。您可以进一步谷歌Db
以获取有关此问题的更多研究。
答案 1 :(得分:1)
NHibernate通常在具有不确定的瞬态或分离实体时运行更新。也就是说,它不知道它是否有父对象的实体管理它,或者它不确定该实体是否脏。这通常是某个地方的错误映射(某些父级上缺少反向)的症状,或者您的实体上没有版本或日期列。