Skip to content

NH-3478 - StatefulPersistenceContext.RemoveEntity KeyNotFoundException on Evict #1310

Closed
@nhibernate-bot

Description

@nhibernate-bot

Jenar created an issue — 7th June 2013, 6:59:30:

In rev 3.2.0 and 3.3.3 i am still getting this Exception (as already reported in closed NH-1845, because test could not reproduce it):

   bei System.ThrowHelper.ThrowKeyNotFoundException()
   bei System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   bei NHibernate.Engine.StatefulPersistenceContext.RemoveEntity(EntityKey key)
   bei NHibernate.Event.Default.DefaultEvictEventListener.OnEvict(EvictEvent event)
   bei NHibernate.Impl.SessionImpl.FireEvict(EvictEvent evictEvent)
   bei NHibernate.Impl.SessionImpl.Evict(Object obj)
   bei NHibernate.Engine.CascadingAction.EvictCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled)
   bei NHibernate.Engine.Cascade.CascadeToOne(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
   bei NHibernate.Engine.Cascade.CascadeAssociation(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
   bei NHibernate.Engine.Cascade.CascadeProperty(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
   bei NHibernate.Engine.Cascade.CascadeCollectionElements(Object parent, Object child, CollectionType collectionType, CascadeStyle style, IType elemType, Object anything, Boolean isCascadeDeleteEnabled)
   bei NHibernate.Engine.Cascade.CascadeCollection(Object parent, Object child, CascadeStyle style, Object anything, CollectionType type)
   bei NHibernate.Engine.Cascade.CascadeAssociation(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
   bei NHibernate.Engine.Cascade.CascadeProperty(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
   bei NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything)
   bei NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent)
   bei NHibernate.Event.Default.DefaultEvictEventListener.DoEvict(Object obj, EntityKey key, IEntityPersister persister, IEventSource session)
   bei NHibernate.Event.Default.DefaultEvictEventListener.OnEvict(EvictEvent event)
   bei NHibernate.Impl.SessionImpl.FireEvict(EvictEvent evictEvent)
   bei NHibernate.Impl.SessionImpl.Evict(Object obj)

So please add this path to next release as suggested long time ago in https://forum.hibernate.org/viewtopic.php?f=25&t=993443&view=previous

Index: StatefulPersistenceContext.cs
=====================================================
--- StatefulPersistenceContext.cs (revision 10712)
+++ StatefulPersistenceContext.cs (revision 10713)
@@ -430,6 +430,9 @@
      /// </summary>
      public object RemoveEntity(EntityKey key)
      {
+ if (!entitiesByKey.ContainsKey(key))
+ return null;
+
         object tempObject = entitiesByKey[key];
         entitiesByKey.Remove(key);
         object entity = tempObject;:

Unfortunately i can't give you test because it is beeing thrown in our project with a little bit complicated Object structure (BO) and it occurs only from time to time.

Anyway, this patch is WORTH TO BE ADDED.
Thank you


Jenar added a comment — 10th June 2013, 12:38:38:

I think this exception could happend if mapping for Object_A will somehow contain a collection ie. <BAG> with the same Object_A. And you will try to Evict Object_A

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions