У меня есть один бит денормализованных данных, используемых по соображениям производительности, и я пытаюсь поддерживать данные с помощью прослушивателя событий NHibernate, а не триггера. Я не уверен, что это лучший подход, но я глубоко в этом разбираюсь и хочу разобраться, прежде чем двигаться дальше. Я получаю следующую ошибку:
System.InvalidOperationException : Collection was modified; enumeration operation may not execute.
System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
System.Collections.Generic.List`1.Enumerator.MoveNextRare()
System.Collections.Generic.List`1.Enumerator.MoveNext()
NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
NHibernate.Engine.ActionQueue.ExecuteActions()
NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (IEventSource session)
NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
NHibernate.Impl.SessionImpl.Flush()
NHibernate.Transaction.AdoTransaction.Commit()
Вот код для выполнения:
using (var tx = session.BeginTransaction())
{
var business = session
.Get<Business>(1234)
.ChangeZipCodeTo("92011");
session.Update(business);
tx.Commit(); // error happens here
}
и прослушиватель событий:
public void OnPostUpdate(PostUpdateEvent @event)
{
var business = @event.Entity as Business;
if (business != null)
{
var links = @event.Session
.CreateQuery("select l from BusinessCategoryLink as l where l.Business.BusinessId = :businessId")
.SetParameter("businessId", business.BusinessId)
.List<BusinessCategoryLink>();
foreach (var link in links)
{
link.Location = business.Location;
@event.Session.Update(link);
}
}
}