Skip to content

Collection was modified; enumeration operation may not execute, Bulk insert with Post Events #1914

Closed
@gokhanabatay

Description

@gokhanabatay

Using OnPostEventListener, I get "Collection was modified; enumeration operation may not execute." exception.

I use batch insert, so in my opinion, when inserting records batch, new inserts comes, so it gets exception.
So what is the best way to prevent it? I need to log changes on entity column by column, and to do that I use post insert/update/delete events.

If I open a new session and transaction, every thing is fine, but I need them in the same transaction.

public void OnPostInsert(PostInsertEvent @event)
{
    Type entityType = @event.Entity.GetType();
    TraceClass traceClass = GetTraceClass(entityType);

    if (!IsTraceable(traceClass, TraceType.Save)) return;

    AbstractEntityPersister persister = @event.Persister as AbstractEntityPersister;
    CfgTraceLog traceLog = InitializeTraceLog(entityType.Name, @event, persister, TraceType.Save);

    for (int index = 0; index < persister.PropertyNames.Count(); index++)
    {
        if (!persister.PropertyInsertability[index])
        {
            continue;
        }

        string property = persister.PropertyNames[index];
        if (!IsTraceable(traceClass, property, TraceType.Save))
        {
            continue;
        }

        object value = GetUnderlyingValue(@event.Session, traceClass, @event.State[index], ref property);
        if (value == null)
        {
             continue;
        }

        if (!traceLog.TraceLogDets.Any(x => x.Field == property))
        {
            traceLog.AddTraceLogDet(new CfgTraceLogDet()
            {
                Field = property,
                OldValue = null,
                NewValue = value?.ToString()
            });
        }
    }

    if (traceLog.TraceLogDets.Count > 0)
    {
        @event.Session.Save(traceLog);
    }
}
   at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in C:\nhibernate-master\nhibernate-core-master\src\NHibernate\Engine\ActionQueue.cs:line 166
   at NHibernate.Engine.ActionQueue.ExecuteActions() in C:\nhibernate-master\nhibernate-core-master\src\NHibernate\Engine\ActionQueue.cs:line 248
   at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) in C:\nhibernate-master\nhibernate-core-master\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:line 249
   at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) in C:\nhibernate-master\nhibernate-core-master\src\NHibernate\Event\Default\DefaultFlushEventListener.cs:line 19
   at NHibernate.Impl.SessionImpl.Flush() in C:\nhibernate-master\nhibernate-core-master\src\NHibernate\Impl\SessionImpl.cs:line 1333
   at NHibernate.Impl.SessionImpl.FlushBeforeTransactionCompletion() in C:\nhibernate-master\nhibernate-core-master\src\NHibernate\Impl\SessionImpl.cs:line 2022
   at NHibernate.Impl.SessionImpl.BeforeTransactionCompletion(ITransaction tx) in C:\nhibernate-master\nhibernate-core-master\src\NHibernate\Impl\SessionImpl.cs:line 2004
   at NHibernate.Transaction.AdoTransaction.Commit() in C:\nhibernate-master\nhibernate-core-master\src\NHibernate\Transaction\AdoTransaction.cs:line 209
   at Framework.Core.DataAccess.UnitOfWork.UnitOfWorkProvider.Commit() in D:\\Framework.Core\DataAccess\UnitOfWork\UnitOfWorkProvider.cs:line 121
   at Framework.Facilities.Batch.BaseBatch.Handle(UnitOfWorkAttribute unitOfWork, Action T0, Action T1, Action T2) in D:\\Framework.Facilities.Batch\BaseBatch.cs:line 55

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions