0

問題が発生しました。コードは単純に見えますが、例外があります。

        DDS.Model.ATest atest = new DDS.Model.ATest();
        atest.AID = Guid.NewGuid();

        ISession session = SessionProvider.GetNewSession();
        using (ITransaction transaction = session.BeginTransaction())
        {
            session.SaveOrUpdate(atest);

            int count = session.CreateQuery("from ATest").List().Count;
            //Above row throw a exception:
            //Batch update returned unexpected row count from update; actual row count: 0; expected: 1

            transaction.Commit();
        }
4

1 に答える 1

1

保存する前にアイテムを読み込もうとしています。最初にトランザクションをコミットしてから、クエリを実行します。

DDS.Model.ATest atest = new DDS.Model.ATest();
//atest.AID = Guid.NewGuid(); // You should not assign IDs by yourself

ISession session = SessionProvider.GetNewSession();
using (ITransaction transaction = session.BeginTransaction())
{
    session.SaveOrUpdate(atest);
    transaction.Commit();
}

int count = session.CreateQuery("from ATest").List().Count;

しかし、それはあなたの場合の問題ではないようです。IDがGuidまたはGuid.combとしてマップされていると思います。IDに値を割り当てないでください。NHibernateがそれを処理します。

値を割り当ててsession.SaveOrUpdate()を呼び出すと、ID値がではないため更新を試みますGuid.Empty。更新メソッドは例外を除いて失敗します。バッチ更新は更新から予期しない行数を返しました。実際の行数:0; 期待される:1UPDATE ... WHERE AID = <some guid>実行されるので。

于 2012-09-08T10:48:48.430 に答える