0

問題:

エラーが発生します:

バッチ更新は、更新から予期しない行数を返しました。実際の行数: 0; 予想: 1

フェッチと削除の間にエンティティが削除されたとき。次の削除行数の後、予想される値は次のように増加します。

バッチ更新は、更新から予期しない行数を返しました。実際の行数: 11; 予想: 12

コード:

var queueEntry = _session.Query<MyTable>().FirstOrDefault(x => x.Id == id);
if (queueEntry != null)
{
    _session.Delete(queueEntry);

    try
    {
        _session.Flush();
    }
    catch (Exception ex)
    {
        _session.Clear();
    }

    return 1;
}

試み:

私はいくつかのことを試しましたが成功しませんでした.次の行をcatch句に追加しました:

_session.Disconnect();
_session.Reconnect();

_session.Flush()ここに置いたコード全体をtransactionでラップしようとしましたtransaction.Commit()

マッピング:

これはコードによるマッピングです

public class MyTable : IEntity
{
    public virtual int Id { get; protected set; }
    public virtual string Type { get; set; }
    public virtual string Source { get; set; }
    public virtual string OperationType { get; set; }
    public virtual bool IsVisible { get; set; }
    public virtual DateTime? Timestamp { get; set; }
    public virtual string ContentId { get; set; }
    public virtual int Priority { get; set; }
}

質問:

この値をリセットする方法はありexpectedますか?例外なく値を削除し続けることができますか?

もちろん、エンティティはテーブルから削除されますが、例外が発生し続けます。catchこの例外を無視するために空の句を使用することは、私にとって解決策ではありません。

編集:

追加情報: このテーブルは長時間実行されるプロセスのキューです。子テーブルはなく、サービスに役立つものはほとんどありません。投稿されたマッピング。最初の削除後ではなく、しばらくしてから発生します。

4

3 に答える 3

2

通常、このエラーは、SQL ステートメントが正常に実行されたが、SQL Server によって返された ROWCOUNT が 1 ではなく 0 であることを意味します。

これには、不適切なマッピング、行数がオフになっているトリガーなど、いくつかの原因が考えられます。

SQL サーバーで実行される SQL ステートメントを確認することで、問題を明確に理解することができます。これは、nHibernate sql ロギングをオンにするか、sql プロファイラーを使用することで実行できます。SQL を取得したら、原因がわかる場合があります。そうでない場合は、手動で SQL を実行して、何が起こるかを確認してください。

また、マッピングを投稿できれば、人々が問題を発見するのに役立ちます

于 2013-09-16T08:38:48.930 に答える
-1

この問題はSessionFactory

使用するSessionFactory.SaveOrUpdate

于 2014-12-29T14:38:19.843 に答える