2009-08-17 60 views
8

是否有NHibernate的一個方式開始與模型非代理NHibernate的部分更新

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

現在保存此模型僅更新名稱,而不首先從會話選擇的模式?

+0

更新了我的答案了一下。 – 2010-04-26 12:40:09

回答

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類動態更新。

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

我不確定在這個時候如果.Update遇到數據庫,我也不想要它。 – bleevo 2009-08-17 00:57:30

+0

試試吧。最有可能的是,更新不會立即命中數據庫。它只是將模型放到會話中,並將其標記爲骯髒,以至於無論如何都將被存儲。 – 2009-08-17 07:55:15

+0

動態更新在這種情況下不起作用,因爲NH沒有原始值,也不知道發生了什麼變化。看到這個問題:http://stackoverflow.com/questions/1243390/what-is-the-best-approach-to-update-only-changed-properties-in-nhibernate-when-se/1243739#1243739 – 2009-08-17 07:56:18

1

斯特凡說什麼看起來像你需要什麼。請注意,這確實是一個優勢案例,除非您遇到一些超高性能問題,否則您應該對完全加載實體感到滿意。

如果你根本就不想打數據庫 - 嘗試使用高速緩存 - 實體緩存是非常簡單和高效。

如果你的實體是一個巨大的一個 - 即它包含BLOB或東西 - 想想兩個分裂它(有許多到一個讓你可以使用延遲加載)。