NHibernate的冲洗造成的更新那里应该是无(Nhibernate Flush causing

2019-07-28 22:49发布

我现在用的回购模式,我已经设置了测试,以复制我的一个HTTP请求进来,然后导致工作单元配置上一次的测试已经完成。

看来,执行HQL语句,然后调用displose(这反过来又调用flush)后,这是造成在各种元素的更新。

非常的bizzare - 有没有人遇到此之前?

这是我的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

Answer 1:

我面临着类似的问题。 我先告诉你是什么原因造成这一点。 当NHibernate从获取实体DB其值分配给它的道具。 有迹象表明,在空值几个道具DB ,但不是Nullable的类定义的类型。 所以NHibernate为它们分配一个默认值,例如 0intDateTime.MinValuedatetime等。当你调用commit的事务, NHibernate重新检查与属性值DB值,并因为它应该有道具Null值现在有一个默认值, NHibernate认为值已经改变并导致更新。

解:

  1. 使用nullable datatypes邮寄他们固定为你的类的道具? 但对我来说这是造成其他问题。
  2. 地图您的属性Not Null类型,但这不是在大多数情况下优选。
  3. 我使用的解决方案:我指定的默认值在实体的构造函数中的道具,所以不是节省Null的值Db Nhibernate节省了一些默认值,这将停止不必要的更新调用。

您可能会进一步谷歌NHibernate ghostbuster对这一问题进行更多的研究。



Answer 2:

NHibernate的通常运行更新时有短暂的或分离的实体,它是不知道。 也就是说,它不知道它是否有家长对管理它,如果它不知道对象是脏的实体。 这通常是一个坏映射的症状的地方(在一些家长缺少倒数),或者你对你的实体没有版本或日期列。



文章来源: Nhibernate Flush causing Updates where there should be none