Closed
Description
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