NHibernate.StaleStateException: Batch update returned unexpected row count from update; actual row count: 0; expected: 2735

3,414 views
Skip to first unread message

Mikael Henriksson

unread,
Sep 28, 2009, 5:33:43 AM9/28/09
to nhu...@googlegroups.com
I "guess" this would happen if I try to update an entity without changes? Actually I am updating two entities and it could also be because of saving the parent first. I am updating both records so both should have already been created. 2x update in other words. Since I'm still awaiting NHibernate in Action I'll ask here :)

The following code fails some of the times with the exception from the subject.

Persistence code:
_session.SaveOrUpdate(child);
_session.SaveOrUpdate(child.Parent);

_session.Transaction.Commit();

The exception: 
NHibernate.StaleStateException: Batch update returned unexpected row count from update; actual row count: 0; expected: 2735
at NHibernate.AdoNet.Expectations.VerifyOutcomeBatched(Int32 expectedRowCount, Int32 rowCount)     
at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps)     
at NHibernate.AdoNet.AbstractBatcher.ExecuteBatchWithTiming(IDbCommand ps)     
at NHibernate.AdoNet.SqlClientBatchingBatcher.AddToBatch(IExpectation expectation)     
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)     
at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)     
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session)     
at NHibernate.Action.EntityUpdateAction.Execute()     
at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)     
at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)     
at NHibernate.Engine.ActionQueue.ExecuteActions()     
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)     
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)     
at NHibernate.Impl.SessionImpl.Flush()     
at NHibernate.Transaction.AdoTransaction.Commit()     
at Company.Project.Data.Update(Child child)

The mappings:

public ParentMap()
{
    Table("parent_table");

    Id(x => x.Id)
        .GeneratedBy.Assigned()
        .Column("parent_id");
        
    // Map columns
    
    HasMany(x => x.Children)
        .Table("child_table")
        .KeyColumn("parent_id")
        .LazyLoad()
        .Cascade.Delete();            
}

public ChildMap()
{
    Table("child_table");

    Id(x => x.Id)
        .Column("child_id");
        
    // Map columns

    References(x => x.Parent)
        .Column("parent_id")
        .Not.Nullable()
        .Cascade.None()
        .LazyLoad();

    HasMany(x => x.SomeClass)
        .KeyColumn("child_id")
        .Table("some_class_table")
        .Cascade.All()
        .LazyLoad();

    HasMany(x => x.SomeClass2)
        .KeyColumn("child_id")
        .Table("some_class_table2")
        .Cascade.All()
        .LazyLoad();
}




Mikael Henriksson

unread,
Sep 28, 2009, 8:10:57 AM9/28/09
to nhu...@googlegroups.com
No, this is a mapping mistake I think. It becomes a stale exception because it cannot update all records. This would be because of a problem at the cascading end right?
Reply all
Reply to author
Forward
0 new messages