2011-03-06 5 views
1

私はしばらくの間NHibernateを使用していたようですが、このORMのいくつかの基本概念を誤解しています。のは、私は「ブログ」と私はそうのような永続化インスタンスをロードするというクラスがあるとしましょう:NHibernate:接続されたエンティティの明示的な更新呼び出し

using (var tx = Session.BeginTransaction()) 
{ 
    var myBlog = Session.Get(10); 

    tx.Commit(); 
} 

私は今、このインスタンスのプロパティを変更する場合は、NHibernateのは自動的に保存されていない変更を検出しているようだとのUPDATEを生成しますトランザクションコミット。

これは、次の文は正確に同じことを行うことを、発生します

using (var tx = Session.BeginTransaction()) 
{ 
    var myBlog = Session.Get(10); 
    myBlog.Title = "Changed title"; 

    tx.Commit(); 
} 

using (var tx = Session.BeginTransaction()) 
{ 
    var myBlog = Session.Get(10); 

    myBlog.Title = "Changed title"; 
    Session.Update(myBlog); // why is this necessary? 

    tx.Commit(); 
} 

私はNHProfと何の違いも表示されません。では、明示的なUpdateメソッドが存在するのはなぜですか?また、それをいつ使うべきですか?

答えて

1

エンティティが常にセッションに接続されているとは限りません。たとえば、あなたは、DB内のエンティティを受け取るメソッドを持つWebサービス、およびアップデートを持つことができます:

[WebMethod] 
void UpdatePerson(int id, string name){ 
    using (var tx = Session.BeginTransaction(){ 
     var person = new Person(id, name); 
     Session.Update(person); 
     tx.Commit(); 
    } 
} 

このコードは、選択を発行せずにデータベースに更新を実行します。

+0

うわー!これは私の現在のアプリケーションで大きなパフォーマンス上の利点を持っているようです。私の現在の更新メソッドでは、常にIDを使用して添付されたエンティティを取得してから、DTOからすべてのプロパティを1つずつコピーしました。これはもちろん、更新する前にエンティティを最初にフェッチしなければならなかったので、2 dbラウンドトリップになりました!ヒントありがとう! –