Is enough with session.

2009/4/3 joshlrogers <[email protected]>

>
> Disregard please.  I have resolved this issue.
>
> For others who may run into this there seems to be an issue that when
> an exception occurs in the session you can not continue with that
> session.  I resolved by implementing a reset session method whenever
> an exception is caught.  This reset session method disposes of both
> the session and the factory and reinitializes them.
>
>        private void ResetSession()
>        {
>            session.Dispose();
>            sessionFactory.Dispose();
>
>            sessionFactory = (new Configuration().Configure
> ().BuildSessionFactory());
>            session = sessionFactory.OpenSession();
>        }
>
> This allowed subsequent calls to session to work properly.
>
> Thanks,
> Josh
>
> On Apr 3, 10:28 am, joshlrogers <[email protected]> wrote:
> > I am writing tests for my logic layer and I am running into an issue
> > that I have no idea how to debug and I can't find much guidance on the
> > intertubes.  Here is my output from MbUnit.
> >
> > ============
> >
> > NHibernate: SELECT cwtratingg0_.Id as Id17_0_, cwtratingg0_.Name as
> > Name17_0_, cwtratingg0_.UserAdded as UserAdded17_0_,
> > cwtratingg0_.DateAdded as DateAdded17_0_, cwtratingg0_.UserEdited as
> > UserEdited17_0_, cwtratingg0_.DateEdited as DateEdited17_0_ FROM
> > dbo.tblCWTRatingGroups cwtratingg0_ WHERE cwtratingg0_....@p0; @p0 =
> > '100'
> >
> > NHibernate.AssertionFailure: null id in TEAMS_ORM.CWTRatingGroup entry
> > (don't flush the Session after an exception occurs)
> >    at NHibernate.Event.Default.DefaultFlushEntityEventListener.CheckId
> > (Object obj, IEntityPersister persister, Object id, EntityMode
> > entityMode)
> >    at
> > NHibernate.Event.Default.DefaultFlushEntityEventListener.GetValues
> > (Object entity, EntityEntry entry, EntityMode entityMode, Boolean
> > mightBeDirty, ISessionImplementor session)
> >    at
> > NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity
> > (FlushEntityEvent event)
> >    at
> > NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities
> > (FlushEvent event)
> >    at
> >
> NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions
> > (FlushEvent event)
> >    at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush
> > (FlushEvent event)
> >    at NHibernate.Impl.SessionImpl.Flush()
> >    at TEAMSData.DataLayer.NHibernateDataProvider.ModifyCWTRatingGroup
> > (CWTRatingGroup ratingGroup) in C:\Source\TEAMS\TEAMS\TEAMSData
> > \DataLayer\NHibernateDataProvider.cs:line 87
> >    at TEAMSLogic.CWTRatingLogic.ModifyCWTRatingGroup(String name,
> > Int32 ratingGroupId, Int32 userEditedId) in C:\Source\TEAMS\TEAMS
> > \TEAMSLogic\CWTRatingLogic.cs:line 35
> >    at TEAMSDataUnitTests.CWTRatingLogicTests.CanModifyCWTRatingGroup()
> > in C:\Source\TEAMS\TEAMS\TEAMSUnitTests\CWTRatingLogicTests.cs:line 44
> >
> > ============
> >
> > Here is my unit test:
> >
> > ============
> >
> >         [Test]
> >         [DependsOn(typeof(CWTRatingGroupTests),
> > "CanGetCWTRatingGroupByName")]
> >         [DependsOn("CanAddCWTRatingGroup")]
> >         public void CanModifyCWTRatingGroup()
> >         {
> >             string newGroupName = "Logic Modified Group";
> >
> >             CWTRatingGroup ratingGroup =
> > _Provider.GetCWTRatingGroupById(100);
> >
> >             _RatingLogic.ModifyCWTRatingGroup(newGroupName,
> > ratingGroup.Id, 1);
> >
> >             ratingGroup = _Provider.GetCWTRatingGroupByName
> > (newGroupName);
> >
> >             Assert.IsNotNull(ratingGroup);
> >             Assert.AreEqual(1, ratingGroup.UserEdited.Id);
> >
> >         }
> >
> > ===========
> >
> > Here is my logic code:
> >
> > ===========
> >
> >         public void ModifyCWTRatingGroup(string name, int
> > ratingGroupId, int userEditedId)
> >         {
> >             CWTRatingGroup ratingGroup = provider.GetCWTRatingGroupById
> > (ratingGroupId);
> >
> >             ratingGroup.Name = name;
> >             ratingGroup.UserEdited = provider.GetUserById
> > (userEditedId);
> >
> >             provider.ModifyCWTRatingGroup(ratingGroup);
> >         }
> >
> > ===========
> >
> > Finally my data layer
> >
> > ===========
> >
> >         public void ModifyCWTRatingGroup(CWTRatingGroup ratingGroup)
> >         {
> >             if (ratingGroup.UserEdited == null)
> >                 throw new ArgumentException("UserEdited may not be
> > null");
> >
> >             try
> >             {
> >                 ratingGroup.DateEdited = DateTime.Now;
> >
> >                 session.Transaction.Begin();
> >
> >                 session.Update(ratingGroup);
> >                 session.Flush();
> >
> >                 session.Transaction.Commit();
> >             }
> >             catch (Exception)
> >             {
> >                 session.Transaction.Rollback();
> >                 throw;
> >             }
> >
> >         }
> >
> > ==========
> >
> > I have stepped through this and everything looks kosher.  ratingGroup
> > in the DAL has all the required fields populated with valid values.
> > It's Id is definitely populated and is not null.  The exception is
> > thrown when Flush() is called.
> >
> > I hope someone has an idea because this code works in another test it
> > was when I added the logic layer in the middle that this code began to
> > throw an exception.
> >
> > Thank you in advance,
> > Josh Rogers
> >
>


-- 
Fabio Maulo

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to