2009-08-17 14 views
8

はunproxiedモデルNHibernateの部分更新

var m = new Model() { ID = 1 }; 
m.Name = "test"; 
//Model also has .LastName and .Age 

このモデルは唯一の最初のセッションからモデルを選択せず​​に名前を更新し、保存して起動するNHibernateの中に方法はありますか?

+0

私の答えは少し更新されました。 –

答えて

2

は、名前、彼らがnullに設定されていない限り、あなたは、データベース内の元の値でこれらを初期化する必要があります。

HQL update operations;私は自分で試したことはありません。

ネイティブSQLステートメントを使用することもできます。 ( "Update model set name ...")。

通常、この最適化は必要ありません。データの選択を避ける必要があるケースは非常にまれですので、このSQL文を記述するのは時間の無駄です。あなたはORMを使用しています。つまり、ソフトウェアオブジェクトを作成します。あなたがそれから多くの利点を得ることができない限り。

0

http://www.hibernate.org/hib_docs/nhibernate/html/mapping.html

動的更新( オプション、デフォルトはfalse):UPDATE SQL は、実行時に生成されなければならないと は、その 値が変更されたカラムだけを含むことを指定します。

HBMのクラスにdynamic-updateを配置します。モデルは、他の性質を持っている場合

var m = new Model() { ID = 1 }; 
m = session.Update(m); //attach m to the session. 
m.Name = "test"; 
session.Save(m); 
+0

.Updateがデータベースにヒットした場合、現時点ではわかりませんが、私はそれも望んでいません。 – bleevo

+0

試してみてください。おそらく、データベースを更新しないでください。それは単にモデルをセッションに置き、とにかくそれが格納されるように汚いとマークします。 –

+0

NHは元の値を持たず、何が変更されたか分からないため、この場合はdynamic-updateが機能しません。この質問を参照してください:http://stackoverflow.com/questions/1243390/what-is-the-best-approach-to-update-only-changed-properties-in-nhibernate-when-se/1243739#1243739 –

1

ステファン氏はあなたが必要とするもののように見えます。これは本当に最悪のケースであり、超高性能の問題がなければエンティティを完全に読み込むことに満足しているはずです。

データベースをヒットしたくない場合は、キャッシュエンティティキャッシュを使用してみてください。非常に単純で効率的です。

エンティティが巨大な場合(つまり、塊や何かが含まれている場合)、それを2つに分割することを考えてください(多対一のため、遅延読み込みを利用できます)。