Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 11th, 2012  |  syntax: None  |  size: 4.00 KB  |  hits: 60  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. NHibernate with Rhino Security - Illegally attempted to associate a proxy with two open Sessions
  2. 2012-01-02 21:47:52,176 [9] ERROR NHibernate.Event.Default.AbstractFlushingEventListener [(null)] - Could not synchronize database state with session
  3. NHibernate.LazyInitializationException: Initializing[Rhino.Security.Model.EntityType#8007cc24-9cdd-447c-a9cd-9fcc015fa95c]-Illegally attempted to associate a proxy with two open Sessions
  4.    at NHibernate.Proxy.AbstractLazyInitializer.set_Session(ISessionImplementor value)
  5.    at NHibernate.Engine.StatefulPersistenceContext.ReassociateProxy(ILazyInitializer li, INHibernateProxy proxy)
  6.    at NHibernate.Engine.StatefulPersistenceContext.ReassociateIfUninitializedProxy(Object value)
  7.    at NHibernate.Event.Default.ProxyVisitor.ProcessEntity(Object value, EntityType entityType)
  8.    at NHibernate.Event.Default.AbstractVisitor.ProcessValue(Object value, IType type)
  9.    at NHibernate.Event.Default.AbstractVisitor.ProcessValue(Int32 i, Object[] values, IType[] types)
  10.    at NHibernate.Event.Default.AbstractVisitor.ProcessEntityPropertyValues(Object[] values, IType[] types)
  11.    at NHibernate.Event.Default.AbstractVisitor.Process(Object obj, IEntityPersister persister)
  12.    at NHibernate.Event.Default.DefaultDeleteEventListener.OnDelete(DeleteEvent event, ISet transientEntities)
  13.    at NHibernate.Event.Default.DefaultDeleteEventListener.OnDelete(DeleteEvent event)
  14.    at NHibernate.Impl.SessionImpl.FireDelete(DeleteEvent event)
  15.    at NHibernate.Impl.SessionImpl.Delete(Object obj)
  16.    at Rhino.Security.DeleteEntityEventListener.OnPreDelete(PreDeleteEvent deleteEvent) in C:UsersjirwinDownloadsrhinorhino-securityRhino.SecurityDeleteEntityEventListener.cs:line 43
  17.    at NHibernate.Action.EntityDeleteAction.PreDelete()
  18.    at NHibernate.Action.EntityDeleteAction.Execute()
  19.    at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
  20.    at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
  21.    at NHibernate.Engine.ActionQueue.ExecuteActions()
  22.    at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
  23.        
  24. ISession childSession = deleteEvent.Session.GetSession(EntityMode.Poco);    
  25. // because default flush mode is auto, a read after a scheduled delete will invoke
  26. // the auto-flush behaviour, causing a constraint violation exception in the
  27. // underlying database, because there still are EntityGroup entities that need
  28. // the deleted EntityReference/SecurityKey.
  29. childSession.FlushMode = FlushMode.Commit;    
  30. childSession.Delete(entityReference);
  31.        
  32. public class NHibernateActionFilter : ActionFilterAttribute
  33. {
  34.     private static readonly ISessionFactory sessionFactory = BuildSessionFactory();
  35.  
  36.     private static ISessionFactory BuildSessionFactory()
  37.     {
  38.         return new Configuration()
  39.             .Configure()
  40.             .BuildSessionFactory();
  41.     }
  42.  
  43.     public override void OnActionExecuting(ActionExecutingContext filterContext)
  44.     {
  45.         var sessionController = filterContext.Controller as SessionController;
  46.  
  47.         if (sessionController == null)
  48.             return;
  49.  
  50.         sessionController.Session = sessionFactory.OpenSession();
  51.         sessionController.Session.BeginTransaction();
  52.     }
  53.  
  54.     public override void OnActionExecuted(ActionExecutedContext filterContext)
  55.     {
  56.         var sessionController = filterContext.Controller as SessionController;
  57.  
  58.         if (sessionController == null)
  59.             return;
  60.  
  61.         using (var session = sessionController.Session)
  62.         {
  63.             if (session == null)
  64.                 return;
  65.  
  66.             if (!session.Transaction.IsActive)
  67.                 return;
  68.  
  69.             if (filterContext.Exception != null)
  70.                 session.Transaction.Rollback();
  71.             else
  72.                 session.Transaction.Commit();
  73.         }
  74.     }
  75. }
  76.        
  77. var entity = session.Load<T>(21415);
  78. session.Delete(entity);
  79.        
  80. var queryString = string.Format("delete {0} where id = :id", typeof(T));
  81.             Session.CreateQuery(queryString)
  82.                    .SetParameter("id", id)
  83.                    .ExecuteUpdate();