0

Session.Updateを使用してエンティティを更新してから、別のSQLクエリを実行し続けようとしています。他のクエリは変更された値を認識しませんでした。プロファイラーを使用してトレースしたとき、Session.Update何もしませんでした。

public class InvoiceService()
{
    public void Update(Invoice invoice)
    {
        using (var trans = BeginTransaction())
        {
            Session.Update(invoice); //Nhibernate did not update invoice. 

            ExecuteNamedQuery(); //Query executed before invoice updated.

            trans.Commit(); //Invoice updated.
        }
    }
}

次に、Session.Updateの後にSession.Flushを追加します。

using (var trans = BeginTransaction())
{
    Session.Update(invoice);
    Session.Flush()

    ExecuteNamedQuery();

    trans.Commit();
}

実行後Session.Flush、更新用のSQLクエリも実行されます。それは完璧に動作します。実行順序は正しいです。しかし、それから私はすべての請求書を取得するために別の方法を実行しました。トランザクションをコミットすると、nhibernateは更新クエリを実行して、更新された請求書を古い値で以前に更新します。(例:数量= 20、10に更新され、次に20に再度更新されます)

public void FindAll()
{
    using (var trans = BeginTransaction())
    {
        var invoices = Session.CreateCriteria<Invoice>().List<Invoice>();

        trans.Commit(); // In here invoice that i updated earlier get updated again, using old values.

        return invoices;
    }
}

なぜ再び更新されるのですか?

この問題の解決策は何ですか?

前もって感謝します。

4

1 に答える 1

3

Updateメソッドの残念な名前です。の目的はUpdate、一時的なインスタンスを新しいセッションにアタッチすることです。更新のドキュメントを参照し、インスタンスの状態を理解してください。

NHibernate は請求書が変更されたと判断するため、請求書は元の値に更新されます。この「ファントム」更新は、プロパティが予期せず変更されたことが原因である可能性があります。一般的な根本原因は、null 非許容プロパティにマップされた null 許容データベース列 (またはその逆) です。トラブルシューティングの最も簡単な方法はdynamic-update、NHibernate がどのプロパティをダーティとして検出するかを確認できるように、セッション ファクトリ構成で有効にすることです。

于 2012-12-24T16:20:14.570 に答える