Hi, I think it has to do with some internal parts of the project. I don't think it's related to a NHibernate bug or something like that. It's just that, semantically, my application has to differ a Case with version 1 and a Case with version 2.
Anyway, perhaps it looks strange. I will review that part and if I find it's related with NHibernate, I'll come back and let you know. Greetings El jueves, 2 de enero de 2014 20:30:10 UTC-5, [email protected] escribió: > > Hi, > Good to know that you solved your problem! and even better that you > updated forum about it. :) > > I have a few questions with EntityBase.Equals() from the code below. > > Why do you consider Version for Equals()? NHibernate should be able to > take care of that if you have Version property mapped. Am I missing > something? > > Also As per my understanding, while writing back to DB, NHibernate calls > Equals() to check if an object is already in the Session. Then if it finds > the object, it will check the Version property from the mapping and decide > whether to Update or Add or No changes required on the DB. Right? > > On Sunday, December 29, 2013 10:50:03 PM UTC+5:30, Daniel Ricardo Castro > Alvarado wrote: >> >> Oh, sorry. >> I forgot to add the classes: >> >> EntityBase, just to avoid adding Version and Id in each entity >> >> abstract public class EntityBase >> { >> public virtual Guid Id { get; protected set; } >> public virtual int Version { get; set; } >> >> // Two entities are considered equal if their Ids are the same >> public override bool Equals(object obj) >> { >> if (obj == null) >> return false; >> >> var other = obj as EntityBase; >> if (other == null) >> return false; >> >> if (Id.Equals(Guid.Empty)) >> return ReferenceEquals(this, obj); >> return Id.Equals(other.Id) && Version == other.Version; >> } >> >> public override int GetHashCode() >> { >> return Id.GetHashCode(); >> } >> } >> >> >> >> public abstract class RegistryBase : EntityBase >> { >> // -- additional properties omitted -- >> >> public virtual short Priority { get; protected set; } >> } >> >> public abstract class Case : RegistryBase >> { >> // -- additional properties ommited -- >> >> public virtual IList<Specimen> Specimens { get; set; } >> } >> >> >> >> El sábado, 28 de diciembre de 2013 17:07:25 UTC-5, Gunnar Liljas escribió: >>> >>> In general I would suggest inverse=true for bidirectional mappings. >>> >>> >>> I have been unable to get the same error, though. Could you show both >>> classes and their mappings? >>> >>> /G >>> >>> >>> >>> >>> >>> >>> 2013/12/28 Daniel Ricardo Castro Alvarado <[email protected]> >>> >>>> (I'm sending my post again because the previous one was not showing >>>> after some days) >>>> >>>> Hello everyone, >>>> >>>> I'm making a test method for an application and I'm having trouble >>>> getting it to work correctly. >>>> >>>> In my model, one Case has many Specimen (but one Specimen is associated >>>> with only one Case). >>>> I'm trying to add one Case with some Specimens to the database and then >>>> removing the Specimens (but not deleting the Case), but somehow I get >>>> StaleStateException and I can't figure why. >>>> >>>> Case.Specimens is mapped as a One to many collection with >>>> inverse="false" and cascade="all-delete-orphan". The relationship is >>>> bidirectional (i.e. each Specimen has a reference to the Case), though I >>>> don't think that's relevant. >>>> >>>> using (var session = >>>> DatabaseSetUpFixture.SessionFactory.OpenSession()) >>>> using (var tx = session.BeginTransaction()) >>>> { >>>> Case original = AddSampleCase(session); >>>> >>>> original.Specimens = new List<Specimen>() { >>>> CreateSampleSpecimen() >>>> }; >>>> >>>> session.Flush(); // Save the changes >>>> session.Clear(); // Evict all entities from the session >>>> >>>> Case newVersion = session.Get<Case>(original.Id); // >>>> Get the DB version >>>> newVersion.Specimens.Clear(); // Remove all the >>>> specimens >>>> >>>> session.Update(newVersion); >>>> session.Flush(); // StaleStateException here :S >>>> >>>> // ... >>>> >>>> tx.Rollback(); // Leave the test DB untouched >>>> } >>>> } >>>> >>>> I need to use the same session so I can rollback all the changes made >>>> (as this is a test method). >>>> If I comment "newVersion.Specimens.Clear();" the test ends normally >>>> (but I need that line, of course), and I don't understand why (even if I >>>> change some attributes of the Case) >>>> >>>> The stack trace is included below: >>>> >>>> en >>>> NHibernate.AdoNet.Expectations.BasicExpectation.VerifyOutcomeNonBatched(Int32 >>>> >>>> rowCount, IDbCommand statement) en >>>> p:\nhibernate-core\src\NHibernate\AdoNet\Expectations.cs:línea 29 >>>> en NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation >>>> expectation) en >>>> p:\nhibernate-core\src\NHibernate\AdoNet\NonBatchingBatcher.cs:línea 41 >>>> en NHibernate.Persister.Entity.AbstractEntityPersister.Delete(Object >>>> id, Object version, Int32 j, Object obj, SqlCommandInfo sql, >>>> ISessionImplementor session, Object[] loadedState) en >>>> p:\nhibernate-core\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:línea >>>> >>>> 2919 >>>> en NHibernate.Persister.Entity.AbstractEntityPersister.Delete(Object >>>> id, Object version, Object obj, ISessionImplementor session) en >>>> p:\nhibernate-core\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:línea >>>> >>>> 3102 >>>> en NHibernate.Action.EntityDeleteAction.Execute() en >>>> p:\nhibernate-core\src\NHibernate\Action\EntityDeleteAction.cs:línea 70 >>>> en NHibernate.Engine.ActionQueue.Execute(IExecutable executable) en >>>> p:\nhibernate-core\src\NHibernate\Engine\ActionQueue.cs:línea 136 >>>> en NHibernate.Engine.ActionQueue.ExecuteActions(IList list) en >>>> p:\nhibernate-core\src\NHibernate\Engine\ActionQueue.cs:línea 126 >>>> en NHibernate.Engine.ActionQueue.ExecuteActions() en >>>> p:\nhibernate-core\src\NHibernate\Engine\ActionQueue.cs:línea 174 >>>> en >>>> NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource >>>> >>>> session) en >>>> p:\nhibernate-core\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:línea >>>> >>>> 249 >>>> en >>>> NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent >>>> event) en >>>> p:\nhibernate-core\src\NHibernate\Event\Default\DefaultFlushEventListener.cs:línea >>>> >>>> 19 >>>> en NHibernate.Impl.SessionImpl.Flush() en >>>> p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:línea 1509 >>>> >>>> So, what is causing StaleStateException? >>>> >>>> Thank you very much >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "nhusers" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To post to this group, send email to [email protected]. >>>> Visit this group at http://groups.google.com/group/nhusers. >>>> For more options, visit https://groups.google.com/groups/opt_out. >>>> >>> >>> -- You received this message because you are subscribed to the Google Groups "nhusers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/nhusers. For more options, visit https://groups.google.com/groups/opt_out.
