-1

以下のアップデートをnhibernateのコンテキストで実行することができません。

using(ITransaction transaction = session.BeginTransaction())
{
    // FIRST I'm GETTING A LIST OF ITEMS IN A MANNER LIKE THIS
    var itemsToDelete = session.QueryOver<Item>()
                                   .Where(i => i.ReferenceObject.Id == otherIdValue)
                                   .List<Item>();

    // THEN I"M LOOPING THROUGH THEM
    for(itemToDelete in itemsToDelete)
    {

        session.Delete(itemToDelete);

        using (iDB2Command command = (iDB2Command)_session.Connection.CreateCommand())
        {
            command.CommandText = "update TABLE_NAME set sequence = (sequence - 1) where id = @someId and sequence > @sequenceNumberDeleted";
            command.DeriveParameters();
            command.Parameters["@someId"].Value = idValue;
            command.Parameters["@sequenceNumberDeleted"].Value = itemToDelete.Sequence;
        }
    }

    transaction.commit()
}

問題はシーケンス=(シーケンス-1)にあるようです。ルーチンが呼び出されるたびに、NHibernateは「予期しない行数」例外をスローします。この例外に関連して私が見つけたほとんどの記事を調査しているときに、他の行を更新するテーブルのトリガーが原因でした。この場合、テーブルにはトリガーはありません。さらに、sequence = 5またはその他の定数を置き換えると、updateステートメントは問題なく実行されます。

DATE TIME [10] ERROR App.Controllers.AController - Unexpected row count: 2; expected: 1
DATE TIME [10] ERROR App.Controllers.AController -    at NHibernate.AdoNet.Expectations.BasicExpectation.VerifyOutcomeNonBatched(Int32 rowCount, IDbCommand statement)
   at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation expectation)
   at NHibernate.Persister.Entity.AbstractEntityPersister.Delete(Object id, Object version, Int32 j, Object obj, SqlCommandInfo sql, ISessionImplementor session, Object[] loadedState)
   at NHibernate.Persister.Entity.AbstractEntityPersister.Delete(Object id, Object version, Object obj, ISessionImplementor session)
   at NHibernate.Action.EntityDeleteAction.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 App.Controllers.AController.AMethod(Int32[] otherIdValues, Int32 someIdValue, String someReferenceValue) in    <path>\App\Controllers\AController.cs:line 117

誰かが私を正しい方向に向けるのを手伝ってもらえますか?

編集:ディエゴは非常に正しいです。これは私が急いで得るものです。このコードへの実際の呼び出しはトランザクション内にあり、トランザクションでcommitを呼び出しています。

4

1 に答える 1

0

それ以来、問題の原因を突き止めました。実際のステートメントは、私が思っていたように順番に生成されていませんでした。代わりに、updateコマンドはdeleteコマンドの前に実行されていたため、deleteコマンドは、以前考えていたupdateコマンドではなく、予期しない行数の例外をスローしていました。

于 2012-10-03T14:45:13.130 に答える