web-dev-qa-db-ja.com

「バッチ更新が更新から予期しない行カウントを返しました;実際の行カウント:0;予想:1」問題を解決する方法は?

特定のエンティティを作成しようとするたびにこれを取得します...原因を特定する方法を知りたいだけです。

Fluent NHibernateの自動マッピングを使用しているので、おそらく規則を適切に設定していないか、1つ以上のマッピングファイルで何かをオーバーライドする必要があります。私はこの問題に関してウェブ上で多くの投稿を行ってきましたが、私の場合、なぜそれが起こっているのかを正確に把握するのに苦労しています。

保存しているオブジェクトは非常に単純です。これは、「会社」エンティティを参照し、「住所」エンティティのコレクションを持つ「個人」オブジェクトです。更新は、すでにデータベースにある既存のPersonオブジェクトで正常に機能します。

提案?

ありがとう-wg

28
wgpubs

このエラーは、SQL INSERTステートメントが実行されているが、実行後にSQL Serverから返されるROWCOUNTが0であり、予想どおり1ではないことを意味します。

誤ったマッピングから、行カウントがオフになっているUPDATE/INSERTトリガーまで、いくつかの原因があります。

最善の方法は、SQLステートメントをプロファイルし、何が起こるかを確認することです。これを行うには、 nHibernate sql logging をオンにするか、sqlプロファイラーを使用します。 SQLを入手したら、原因を知ることができます。そうでない場合は、SQLを手動で実行して、何が起こるかを確認してください。

また、マッピングを投稿することをお勧めします。これは、問題を発見するのに役立ちます。

27
Iain

これは、トリガーが行カウントに影響する追加のDML(データ変更)クエリを実行するときに発生する可能性があります。私の解決策は、トリガーの先頭に次を追加することでした:

SET NOCOUNT ON;
13
Mr. TA

これは、主キーの自動インクリメントが原因で発生する場合があります。この問題を解決するには、データセットで自動インクリメント値を挿入しないでください。主キーなしでデータを挿入します。

2
MacDaddy

INSTEAD OFトリガーを使用してビューをターゲットにする場合、正しい行カウントを取得することはほとんど不可能です。ソースを少し掘り下げた後、NHibernateがカウントチェックを無視するようにカスタム永続化を作成できることがわかりました。

public class SingleTableNoResultCheckEntityPersister : SingleTableEntityPersister
{
    public SingleTableNoResultCheckEntityPersister(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping)
        : base(persistentClass, cache, factory, mapping)
    {
        for (int i = 0; i < this.insertResultCheckStyles.Length; i++)
        {
            this.insertResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None;
        }

        for (int i = 0; i < this.updateResultCheckStyles.Length; i++)
        {
            this.updateResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None;
        }

        for (int i = 0; i < this.deleteResultCheckStyles.Length; i++)
        {
            this.deleteResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None;
        }
    }
}
0
Robin Palm