3

変更によって既存のエンティティの更新ステートメントが生成されない原因は何ですか?エンティティのステータス列挙型を更新するコマンドがあります。ActiveからDeletedに変更します。同じコマンドを(一般的に)使用して、他のエンティティのステータスビットを問題なく更新します。問題のエンティティの単一の文字列を他に何も変更せずに更新でき、更新プロセスは正常に行われます。NHProfでこのすべてが下がっているのを見ることができます...

私の質問は次のとおりだと思います。

  • 列挙値(および他に何も...または他のもの)が変更されたときにNHibernateがエンティティを更新しない原因は何ですか?
  • このような問題を追跡するための最良の方法は何ですか?

ご協力いただきありがとうございます!

手掛かり。基本タイプのプロパティは次のとおりです。

public virtual EntityStatus Status { get; protected set; }

セッターを公開して直接割り当てると、NHibernateはそれをうまくピックアップします。保護されている場合は、エンティティのメソッドを呼び出し、そこでステータスを更新します。それは何か手がかりを提供しますか?

4

2 に答える 2

2

だから、これは楽しいものであり、追跡するのはお尻の完全な苦痛でした. Any マッピング内で Lazy ローディングを使用すると、どうにかして古い犬がどこかにねじ込まれていることがわかります。したがって、これを行うと、仮想メソッドを呼び出して保護されたプロパティを更新しても機能しません。

Any(o => o.Thing, typeof(Guid), m =>
                        {
                            m.IdType<Guid>();
                            m.MetaType<string>();
                            m.MetaValue("Squirmy", typeof(SquirmyThing));
                            m.MetaValue("Odoriferous", typeof(OdoriferousThing));
                            m.Columns(id => id.Name("ThingId"), cr => cr.Name("ThingType"));
                            m.Lazy(true);
                            m.Cascade(Cascade.Persist);
                        });

しかし、私がこれを行うとうまくいきます:

Any(o => o.Thing, typeof(Guid), m =>
                        {
                            m.IdType<Guid>();
                            m.MetaType<string>();
                            m.MetaValue("Squirmy", typeof(SquirmyThing));
                            m.MetaValue("Odoriferous", typeof(OdoriferousThing));
                            m.Columns(id => id.Name("ThingId"), cr => cr.Name("ThingType"));
                            m.Lazy(false);
                            m.Cascade(Cascade.Persist);
                        });

とにかく、これが Any マッピングを使用するのに十分なほど狂っている他の誰かに役立つことを本当に願っています.

于 2012-10-16T21:29:54.003 に答える
0

これは、更新しているエンティティがセッション オブジェクトにない場合に発生する可能性があります。元のオブジェクトをクエリしたり、アタッチしたりしたセッションを閉じていないことを確認してください。

また、実際に値を以前とは異なる値に変更していることを確認してください。このエンティティをdynamic-update有効にしていて、実際に値を変更していない場合、更新は生成されません。

dynamic-update (オプション、デフォルトは false): UPDATE SQL が実行時に生成され、値が変更された列のみが含まれるように指定します。

NHibernate のログも有効にして、何を吐き出しているかを調べてみると、ログに役立つ情報が見つかるかもしれません。

正直なところ、問題のあるコードも質問に投稿します。コードを見ることができると、どこで問題が発生するかを判断するのが常に簡単になります。

于 2012-10-12T18:59:34.283 に答える