Hello again,

only for testing i changed the Nhibernate ActionQueue code;

it seems works. (but i'm still waiting for another legal ways. :))))  I
mailed this only for sharing )

        private void ExecuteActions(IList list)
        {
            //this prevents throwing exception if collection changes.
            int actionCount = list.Count;
            for (int i = 0; i < actionCount; i++)
            {
                Execute(list[i] as IExecutable);
            }

            //if something added by the event listeners. this code execute
additions
            int newActions = list.Count;
            for (int i = actionCount; i < newActions; i++)
            {
                Execute(list[i] as IExecutable);
            }

            list.Clear();
            session.Batcher.ExecuteBatch();
        }

it is works on insert operations but insert operations are first executed.
(we have to make history for update,delete also)

so i've changed,

        /// <summary>
        /// Perform all currently queued actions.
        /// </summary>
        public void ExecuteActions()
        {
            ExecuteActions(insertions);
            ExecuteActions(updates);
            ExecuteActions(collectionRemovals);
            ExecuteActions(collectionUpdates);
            ExecuteActions(collectionCreations);
            ExecuteActions(deletions);

            //if something added after insert the executions.
            ExecuteActions(insertions);

        }

10 Nisan 2009 Cuma 11:58 tarihinde Fethi Gürcan <[email protected]>yazdı:

> Hello,
>
> I'm trying to add some history info about insert,update,delete events.
> With log4net, or another way (separate session) it is works. But I'm trying
> to do it in same transaction with the process.
>
> For that case,
>
> I've created a event listener class;
>
>     public class AuditEventListener :
> IPostUpdateEventListener,IPostInsertEventListener,IPostDeleteEventListener
>
> And i've created a History entity class.
>
> In the events i've wrote,
>
>              public void OnPostInsert(PostInsertEvent @event)
>              {
>                     //no history for History type, and prevents recurrence
>                     if (@event.Entity.GetType().Equals(typeof(History)))
>                             return;
>
>                     History history = new History();
>                      .....
>                      .....
>
>                     @event.Session.Save(history);
>              }
>
>
> But it seems, I'm breaking the queue action of nHibernate  :(
>
> It is about NHibernate.Engine.ActionQueue class'es ExecuteActions method.
>
>         private void ExecuteActions(IList list)
>         {
>             foreach (IExecutable executable in list)
>                 Execute(executable);
>
>             list.Clear();
>             session.Batcher.ExecuteBatch();
>         }
>
> it throws an InvalidOperationException (Collection was modified;
> enumeration operation may not execute.).
>
> It is totally understandable issue. (i'd add another action to queue while
> nhibernate processing the queue)
>
> Do you have any suggestion to do this thing  in another way???
>
> If not,  i can change the code of
> NHibernate.Engine.ActionQueue.ExecuteActions methods to prevent this error.
> (I'm not sure, if i change, it will throws another exception in another
> method.)
> (Changing the nhibernate source is the last way i think.)
>
> Thanks.
> --
> Fethi Gürcan
>



-- 
Fethi Gürcan

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to