使用NHibernate EventListener维护非规范化数据
出于性能原因,我使用了一位非规范化的数据,我试图使用NHibernate事件侦听器而不是触发器来维护数据。我不相信这是最好的方法,但我已经深入研究了,我想在继续之前弄清楚这一点。我发现以下错误:使用NHibernate EventListener维护非规范化数据,nhibernate,Nhibernate,出于性能原因,我使用了一位非规范化的数据,我试图使用NHibernate事件侦听器而不是触发器来维护数据。我不相信这是最好的方法,但我已经深入研究了,我想在继续之前弄清楚这一点。我发现以下错误: System.InvalidOperationException : Collection was modified; enumeration operation may not execute. System.ThrowHelper.ThrowInvalidOperationExceptio
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);
}
}
}
这看起来与NHibernate无关,而是C处理迭代器的方式,特别是枚举。我有点猜测,但我认为这是因为您正在修改此行枚举的值:link.Location=business.Location;。快速的google搜索告诉我Enumerator.Current属性是只读的,这是在使用foreach构造时使用的。我打赌使用常规for循环可以解决这个问题。我在对列表执行foreach操作时,在尝试从列表中删除某个项时看到过这种错误,但我不明白为什么在这种情况下会出现问题。显然我做错了什么,所以一个老式的for循环值得一试。如果我能记得如何写其中一个…这绝对是NHibernate的问题。如果你用谷歌搜索,你会找到其他人。问题是,您正在修改NHibernate在执行.Update调用时需要执行的操作列表。是否找到此问题的解决方案?我也面临着同样的问题。不,我无法用事件侦听器完成它。