Nie opróżniaj sesji po wystąpieniu wyjątku - NHibernate
Zajmuję się tworzeniem aplikacji internetowej ASP.NET MVC w wersji .NET 3.5, NHibernate i hostowanej na Windows Azure. Kiedy aplikacja internetowa jest uruchamiana z lokalnej struktury programistycznej, działa poprawnie. Jednak po przeniesieniu go do systemu Windows Azure każda wstawka wykonana z roli internetowej MVC kończy się wyjątkiem wymienionym poniżej.
Jakiś pomysł, co jest nie tak z moją logiką NHibernate? (może być zarządzanie sesją, nie jestem pewien)
[AssertionFailure: null id w pozycji Lokad.Translate.Entities.User (nie opróżniaj sesji po wystąpieniu wyjątku)] NHibernate.Event.Default.DefaultFlushEntityEventListener.CheckId (Object obj, IEntityPersister persister, Object id, EntityMode entityMode) + 292 NHibernate.Event.Default.DefaultFlushEntityEventListener.GetValues (Obiekt obiektu, pozycja EntityEntry, EntityMode entityMode, Boolean couldBeDirty, sesja ISessionImplementor) +93 NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity (zdarzenie FlushEntityEvent) +158 NHibernate.Event.Default.AbstractFlushingEventListener .FlushEntities (zdarzenie FlushEvent) +469 NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions (zdarzenie FlushEvent) +339 NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (zdarzenie FlushEvent) +85 NHibernate.Impl.SessionImpl.Flush () +275 NHibernate.Impl.SessionImpl.Flush () +275 NHibernate .Transaction.AdoTransaction.Commit () +236 Lokad.Translate.Repositories.PageRepository.Create (Strona strony) Lokad.Translate.Controll ers.PagesController.Create (strona strony) lambda_method (ExecutionScope, ControllerBase, Object []) +69 System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) +251 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 parametry) +31 System.Web.Mvc. <> C__DisplayClassa.b__7 () +88 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter (filtr IActionFilter, ActionExecutingContext preContext, Func1 continuation) +534 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList
1 filtry, ActionDescriptor actionDescriptor, parametry IDictionary`2) +312 System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +856 System.Web.Mvc.Controller.ExecuteCore () +185 System.Web.Mvc. MvcHandler.ProcessRequest (HttpContextBase httpContext) +221 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +586 System.Web.HttpApplication.ExecuteStep (krok IExecutionStep, Boolean & completedSynchronically) +177
Zauważ, że używam_session.FlushMode = FlushMode.Commit;
i żeUser
jest używany w zwyczajuRoleProvider
public class SimpleRoleProvider : RoleProvider
{
readonly UserRepository Users = new UserRepository();
public override string[] GetRolesForUser(string username)
{
try
{
var user = Users.Get(username);
// no role if user is not registered
if (null == user) return new string[0];
// default role for registered user
return user.IsManager ? new[] { "Manager", "User" } : new[] { "User" };
}
catch (Exception)
{
// role should not fail in case of DB issue.
return new string[0];
}
}
}