使用nhibernate会话创建sql查询获取的结果出现枚举错误

使用nhibernate会话创建sql查询获取的结果出现枚举错误,nhibernate,sharp-architecture,Nhibernate,Sharp Architecture,我使用的是sharp arch 1.0版 在NHibernate PostUpdateEvent中,我试图访问数据库 public class PostUpdateListener : IPostUpdateEventListener { public void OnPostUpdate(PostUpdateEvent postUpdateEvent) { var session = NHibernateSession.Current;

我使用的是sharp arch 1.0版

在NHibernate PostUpdateEvent中,我试图访问数据库

public class PostUpdateListener : IPostUpdateEventListener 
{ 
    public void OnPostUpdate(PostUpdateEvent postUpdateEvent) 
    { 
        var session = NHibernateSession.Current;

        var results = session.CreateSQLQuery("Select * from Storefront").List<object>();
        for (int i = 0; i < results.Count; i++)
        {
        }
  }
公共类postPDateListener:iposupDateEventListener
{ 
PositUpdate上的公共无效(PositUpdate事件PositUpdate事件)
{ 
var session=NHibernateSession.Current;
var results=session.CreateSQLQuery(“从店面选择*).List();
for(int i=0;i
当我尝试保存任何实体并在postupdateevent中运行此select查询时,它在OnFlush.NHibernate\Listeners\FlushFixEventListener.cs行上给出枚举错误:35

我读到使用foreach循环运行枚举操作比使用for循环更好。但我尝试了使用for循环。仍然并没有什么区别

save操作是使用SharArch NHibernate事务属性处理的。如果我删除了事务属性,那么postPDateListener中的查询工作正常

这是堆栈跟踪

[InvalidOperationException:集合已修改;枚举操作可能无法执行。] System.ThrowHelper.ThrowInvalidOperationException(异常资源)+56 System.Collections.Generic.Enumerator.MoveNextRare()+58 System.Collections.Generic.Enumerator.MoveNext()+93 d:\horn.horn\orm\NHibernate\Working-2.1\src\NHibernate\Engine\ActionQueue.ExecuteActions(IList列表)中的NHibernate.Engine.ActionQueue.ExecuteActions(IList列表):112 d:\horn.horn\orm\NHibernate\Working-2.1\src\NHibernate\Engine\ActionQueue.ExecuteActions()中的NHibernate.Engine.ActionQueue.ExecuteActions() d:\horn.horn\orm\NHibernate\Working-2.1\src\NHibernate\Event\Default.AbstractFlushingEventListener.PerformExecutions(IEventSource会话)中的NHibernate.Event.Default.AbstractFlushingEventListener.cs:241 d:\horn.horn\orm\NHibernate\Working-2.1\src\NHibernate\Event\Default\DefaultFlushEventListener.OnFlush(FlushEvent事件)中的NHibernate.Event.Default.FlusheventListener.OnFlush(FlushEvent事件):19 D:\Solutions\Infrastructure\NHibernate\Listeners\FlushFixEventListener.OnFlush(FlushEvent事件)中的Infrastructure.NHibernate.Listeners.FlushFixEventListener.OnFlush d:\horn.horn\orm\NHibernate\Working-2.1\src\NHibernate\Impl\SessionImpl.Flush()中的NHibernate.Impl.SessionImpl.Flush() Infrastructure.NHibernate.LinqRepository
1.将(T实体)保存在D:\Solutions\Infrastructure\NHibernate\LinqRepository.cs:95中
Tasks.Shared.ContentEntityTasks
4.将(TSaveEntityRequestDetails)保存在D:\Solutions\Tasks\Shared\ContentEntityTasks.cs:96中 在D:\Solutions\Web.Controllers\Entity\Entity\EntityController.cs:379中编辑(EntityViewModel EntityViewModel、HttpPostedFileBase文件名、HttpPostedFileBase mainImageFileName、HttpPostedFileBase缩略图文件名) lambda_方法(ExecutionScope,ControllerBase,Object[])+185 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext ControllerContext,IDictionary
2参数)+236
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor,IDictionary
2个参数)+31 System.Web.Mvc.c_DisplayClassa.b_7()+85 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter筛选器、ActionExecutingContext预文本、Func
1 continuation)+235491
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter筛选器、ActionExecutingContext预文本、Func
1 continuation)+235491 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter筛选器、ActionExecutingContext预文本、Func
1 continuation)+235491
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter筛选器、ActionExecutingContext预文本、Func
1 continuation)+235491 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext ControllerContext,IList
1过滤器,ActionDescriptor ActionDescriptor,IDictionary
2参数)+288 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext ControllerContext,String actionName)+235670 System.Web.Mvc.Controller.ExecuteCore()+174 ProcessRequest(HttpContextBase httpContext)+209 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+599
System.Web.HttpApplication.ExecuteStep(IExecutionStep,Boolean&completedSynchronously)+171

由于CreateSQLQuery调用,似乎正在发生的是会话决定刷新。这导致更新后事件被添加到需要触发的内部事件列表中(猜测此事件)

您应该能够通过使用事件访问子会话而不是主NH会话来修复它。如下所示:

public class PostUpdateListener : IPostUpdateEventListener 
{ 
    public void OnPostUpdate(PostUpdateEvent postUpdateEvent) 
    { 
        var session = postUpdateEvent.Session.GetSession(EntityMode.Poco)

        var results = session.CreateSQLQuery("Select * from Storefront").List<object>();
        for (int i = 0; i < results.Count; i++)
        {
        }
    }
}
公共类postPDateListener:iposupDateEventListener
{ 
PositUpdate上的公共无效(PositUpdate事件PositUpdate事件)
{ 
var session=postUpdateEvent.session.GetSession(EntityMode.Poco)
var results=session.CreateSQLQuery(“从店面选择*).List();
for(int i=0;i

如果您还需要在此事件中添加或更新实体(例如,出于审核日志的目的),那么您还需要确保刷新内部会话。

这是一个多线程应用程序吗?