I posted a message on nhusers but no-one replied. Maybe this
group is a better choice since the post is related to the internals of NH.
The main reason I'm putting it here is that I think the described behavior is a bug, and I would like to first confirm it here before creating a JIRA ticket.



I'm trying to implement an IPostInsert/UpdateEventListener. What I
want to achieve is sending two SQL update queries:


void IPostUpdateEventListener.OnPostUpdate(PostUpdateEvent @event)
{
    /*
     * Getting left and right ommited
     */
    @event.Session.CreateSQLQuery("update categories c set
isbranchactive = 1 where c.lft >= :lft and c.rgt <= :rgt")
                        .SetInt64("lft", left)
                        .SetInt64("rgt", right)
                        .ExecuteUpdate();

}

Nothing special. The problem is it blows up when commiting a
transaction:

[InvalidOperationException: Collection was modified; enumeration
operation may not execute.]
   System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource
resource) +56
   System.Collections.Generic.Enumerator.MoveNextRare() +58
   System.Collections.Generic.Enumerator.MoveNext() +93
   NHibernate.Engine.ActionQueue.ExecuteActions(IList list) +149
   NHibernate.Engine.ActionQueue.ExecuteActions() +32

NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource
session) +253

NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent
event) +97
   NHibernate.Impl.SessionImpl.Flush() +275
   NHibernate.Transaction.AdoTransaction.Commit() +236

I looked into the ExecuteActions(...) and replaced foreach enumeration
with a regular for loop.
Everything seems to work just fine. NH tests are passing (tested on 2.1.2).

Now my question is: is the original behavior a bug. If yes, then is
the proposed solution acceptable?

I need this order of execution and cannot use Pre* Listeners

Thanks,
Filip

Reply via email to