1

シャープアーチver1.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++)
        {
        }
  }

エンティティを保存しようとして、postupdateeventでこの選択クエリを実行すると、OnFlushで列挙エラーが発生します。NHibernate \ Listeners \ FlushFixEventListener .cs行:35

foreachループを使用すると列挙操作が実行されるため、forループを実行する方が適切であると読みました。しかし、私はforループで試しました。それでも違いはありません。

保存操作は、SharArchNHibernateTransaction属性で処理されます。Transaction属性を削除すると、postupdatelistenerのクエリは正常に機能します。

これがスタックトレースです。

[InvalidOperationException:コレクションが変更されました。列挙操作が実行されない場合があります。]System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)+56 System.Collections.Generic.Enumerator.MoveNextRare()+58 System.Collections.Generic.Enumerator.MoveNext()+93NHibernate.Engine.ActionQueue。 d:\ horn.horn \ orm \ nhibernate \ Working-2.1 \ src \ NHibernate \ Engine \ ActionQueue.cs:112のExecuteActions(IListリスト)d:\ horn.horn \ ormのNHibernate.Engine.ActionQueue.ExecuteActions() \ nhibernate \ Working-2.1 \ src \ NHibernate \ Engine \ ActionQueue.cs:147 NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)in d:\ horn.horn \ orm \ nhibernate \ Working-2.1 \ src \ NHibernate \ Event \ Default \ AbstractFlushingEventListener.cs:241NHibernate.Event.Default.DefaultFlushEventListener。1.Save(T entity) in D:\Solutions\Infrastructure\NHibernate\LinqRepository.cs:95 Tasks.Shared.ContentEntityTasks4.D:\ Solutions \のD:\ Solutions \ Tasks \ Shared \ ContentEntityTasks.cs:96 Web.Controllers.Entity.EntityController.Edit(EntityViewModel entityViewModel、HttpPostedFileBase fileName、HttpPostedFileBase mainImageFileName、HttpPostedFileBasethumbnailFileName)に(TSaveEntityRequestDetailsdetails)を保存します。 Web.Controllers \ Entity \ EntityController.cs:379 lambda_method(ExecutionScope、ControllerBase、Object [])+185 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext、IDictionary 2 parameters) +236 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parameters)+31System.Web.Mvc。<> c_ DisplayClassa.b _7()+85 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter、ActionExecutingContext preContext、Func1 continuation) +235491 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func1継続)+235491 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter、ActionExecutingContext preContext、Func 1 continuation) +235491 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func1 continuation)+235491 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext、IList 1 filters, ActionDescriptor actionDescriptor, IDictionary2 parameters)+288System.Web。 Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext、String actionName)+235670 System.Web.Mvc.Controller.ExecuteCore()+174 System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext)+209System.Web.CallHandlerExecutionStep.System。 Web.HttpApplication.IExecutionStep.Execute()+599 System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+171

4

1 に答える 1

0

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++)
        {
        }
    }
}

たとえば、監査ログの目的で、このイベント内のエンティティを追加または更新する必要がある場合は、内部セッションも確実にフラッシュする必要があります。

于 2012-03-02T18:54:26.487 に答える