2010-12-16 3 views
7

NHibernateは常にすべての列の更新を生成しますか?NHibernateはすべての列の更新文を生成します。

 
public class Person 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Address { get; set; } 
} 

Person p = Session.Load(1); 
p.Name = "New Name"; 

Session.Flush();//Update for all columns, but I change only Name 

NHibernateの正常な動作ですか、私の間違いですか? Fluent NHibernateとAutoMappingを使用します。

+1

アンディ他の質問の解決策が他の回答から分かっている場合は、あなたと同じ質問をする他の人に役立つように、それらを受け入れてください。 –

答えて

10

これはデフォルトの動作ですが、<class>マッピングにdynamic-update="true"を追加することによってのみNHが修正済みの列を更新できるようにすることができます。

+0

スナップ、私にそれを打つ:) –

+0

+1 ''のマッピングで 'dynamic-update'と言及しています。私はNHibernateを最後に使用して以来、私はそれを忘れていました。 =) –

+0

@Mauricioは競争の激しい競争相手ですか? Miráque tengoañosde experiencia ... ;-) –

-2

NHibernateは常にマップされたすべての列を更新します。これは、更新時にデータが元のデータストアから以前にポンピングされているため、基本的に列の値を独自の元の値にリセットするだけなので、他の列が変更されていなければ問題ありません。それについては問題ありません。

この動作を無効にする場合は、IInterceptorインターフェイスを実装する必要があります。

+2

これは間違っています。私の答えを見てください。 –

+0

"それはデフォルト動作[...]"と "NHibernateは常にすべてのマッピングされたカラム[...]を更新する"の違いは何ですか?これらの2つの文章は私と同じです。だから、ここではダウンワードは当てはまりません。さらに、この '動的更新 'は、' IInterceptor'インタフェースを実装することで実行できます。だから、これは私の意見では間違いではない。私の答えは、私が謙虚に認めているよりダイナミックな更新について言わないかもしれませんが、よりエレガントなアプローチです。 –

+2

前の言い回しは、振る舞いを簡単に変更できることを意味します(デフォルトの 'false'を' true'に変更するだけです)。後者はできないことを意味します。私はIInterceptorでそれをどうするのか分かりませんが、必要でないマッピングオプションです。答えが誤解を招いていたため、私は下降しただけでした。個人的にはそれをとらないでください:-) –

関連する問題