2010-12-16 51 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

安迪,如果您的其他問題已經知道他人答案的解決方案,請接受他們,以便它可以幫助其他人與您有相同的問題。 – 2010-12-16 20:27:28

回答

10

這是默認行爲,但您只能通過將dynamic-update="true"添加到您的<class>映射中,使NH更新修改的列。

+0

快照,打我:) – 2010-12-16 21:46:59

+0

+1在''映射中提到'dynamic-update'。自從我上次使用NHibernate以來,我已經忘記了這一點。 =) – 2010-12-16 21:53:20

+0

@Mauricio¿es una competencia a verquiése se rascamás? Miráque tengoañosde experiencia ... ;-) – 2010-12-16 21:59:34

-2

NHibernate總是更新所有映射的列。如果其他列沒有變化,這應該不會有問題,因爲更新時數據先前已從底層數據存儲區抽取出來,所以基本上它只會將列值重置爲其原始值。沒問題。

如果您想覆蓋此行爲,您需要實現接口。

+2

這是錯誤的。看到我的答案。 – 2010-12-16 21:46:58

+0

「這是默認行爲[...]」和「NHibernate總是更新所有映射列[...]」之間有什麼區別?這兩句話對我來說是一樣的。所以,這裏沒有downvote。另外,這個「動態更新」可以通過實現IInterceptor接口來執行。所以,我認爲這完全沒有錯。雖然我的回答可能沒有提到「動態更新」,我虛心承認這是一種更加優雅的方法,但倒退是不應該的。 – 2010-12-16 21:52:27

+2

前一句意味着你可以很容易地改變行爲(只是把默認的'false'改爲'true'),而後者意味着你不能,或者你需要做很多工作才能使它做一些不同的事情。我不知道如何使用IInterceptor來完成它,但作爲一個不需要的映射選項。我只是低估了答案,因爲答案是誤導性的,不要個人承擔:-) – 2010-12-16 21:57:54