Thanks!
On 04-Jan-2014 2:15 AM, "Daniel Ricardo Castro Alvarado" <[email protected]>
wrote:

> 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]ó:
>>
>> 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 a topic in the
> Google Groups "nhusers" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/nhusers/w9dUy2WHUKU/unsubscribe.
> To unsubscribe from this group and all its topics, 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.

Reply via email to