Ведение денормализованных данных с помощью NHibernate EventListener - PullRequest
2 голосов
/ 30 октября 2009

У меня есть один бит денормализованных данных, используемых по соображениям производительности, и я пытаюсь поддерживать данные с помощью прослушивателя событий 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); 
        } 
    } 
} 

1 Ответ

1 голос
/ 22 марта 2010

Это не похоже на то, что это связано с NHibernate, а скорее на то, как C # обрабатывает итераторы и, в частности, перечисления. Я отчасти догадываюсь, но я думаю, что это потому, что вы изменяете значение перечисления в этой строке: link.Location = business.Location;. Быстрый поиск в Google говорит мне, что свойство Enumerator.Current доступно только для чтения (что используется при использовании конструкции foreach). Бьюсь об заклад, использование регулярного цикла for решит эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...