2010-10-07 41 views
1

我想實現一個只使用主鍵來刪除實體的存儲庫方法,主要是因爲從一個webapp我通常只在調用「刪除請求」時知道主鍵一個網頁。只能通過主鍵刪除NHibernate中的實體

由於ORM,今天的選項是從數據庫中獲取實體,然後刪除它,這給了我一個額外的往返。

我可以使用HQL刪除,但因爲我想爲所有實體創建一個通用的刪除方法,除非我使用反射來找出哪個字段是主鍵(可以,但不能感覺正確)。

或者它是否需要實體才能正確處理級聯的NHibernate性質?

我試過這種方法,假設它不會加載實體,除非明確需要,但是還沒有時間來測試它。也許有人可以闡明如何處理這個問題?

var entity = session.Load<T>(primaryKey); 
session.Delete(entity); 

編輯:現在已經測試過它,它似乎還沒有完全選擇刪除前的實體。

+1

可能重複[如何刪除對象通過在nhibernate中使用PK?](http://stackoverflow.com/questions/3063777/how-to-delete-an-object-by-using-pk-in-nhibernate) – 2010-10-07 14:26:06

回答

2

Load可能會返回代理對象,但不能保證。您的映射可能包含級聯刪除,這將強制NHibernate從數據庫加載對象,以確定如何刪除對象及其圖形。

我會實現這個使用負載,因爲你在做什麼。對於一些對象,NHibernate可能不需要首先進行選擇。在這種情況下,這是您使用o/r映射器支付的[通常]微不足道的代價。

+0

我一直在試圖弄清楚它何時會返回一個代理對象。你知道它是否只返回被定義爲「懶惰」的類的代理? – jishi 2010-10-07 13:26:55

+0

我不知道,但我的猜測是,如果映射包含任何級聯設置,它將加載對象。這是一個很好的功能 - 您無需擔心清理相關對象。除非出現性能問題,否則我會忍受這種行爲。通過主鍵加載對象通常是非常快速的操作。 – 2010-10-07 16:02:02

1

nHibernate是一個O(bject)RM。我同意你可能需要解決依賴關係的對象。

你當然可以使用直接的ADO.Net調用來刪除你的對象。這當然會帶來自己的問題,因爲您必須自己處理任何級聯問題。如果你走這條路,不要忘記從nHibernate會話中逐出使用這種方法刪除的任何對象。

但是,如果這個刪除是在你的系統的一個非常敏感的部分,那可能是要走的路。

雖然情況確實如此,但我仍然百分百確信。扔掉所有的nHibernate給你,因爲這不會是明智的。

我明白你知道這一點,你正在尋找一個嚴格的nHibernate的答案,我不認爲它存在,對不起。

1

聲明:我目前無法對其進行測試。但不會跟隨的東西幫助:

Person entity = new Person(); 
entity.Id = primaryKey; 
session.Delete(entity); 

不加載實體,但建立只有主鍵的實體。我會喜歡測試它,但現在我的環境無法正常工作。

+0

這可能會起作用,但它可能會拒絕刪除與會話不相關的對象。對於我來說問題並非所有實體都有。作爲主要關鍵,我需要反思以找出哪些是什麼,而不是我認爲的一個漂亮的解決方案。 (還是)感謝你的建議。 – jishi 2010-10-07 13:29:04