I submitted a bug report together with a patch fixing the issue. http://216.121.112.228/browse/NH-2322
I'd be really grateful if somebody could apply it before the 3.0 GA release ;).
Thanks, Filip Zawada On 2010-09-03 04:22, Fabio Maulo wrote:
Ok -- Fabio Maulo El 02/09/2010, a las 20:57, Filip Zawada<[email protected]> escribió: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
