0
我知道我們可以很容易地使用過濾器來查詢NHibernate的其他where
條件,但是有可能在更新或刪除時應用過濾器嗎?NHibernate - 是否可以在UPDATE/DELETE上應用過濾器?
如果是這樣,我該怎麼做到這一點?
我知道我們可以很容易地使用過濾器來查詢NHibernate的其他where
條件,但是有可能在更新或刪除時應用過濾器嗎?NHibernate - 是否可以在UPDATE/DELETE上應用過濾器?
如果是這樣,我該怎麼做到這一點?
是的,它是可能的,使用HQL(Hibernate查詢語言)
這裏有一個批量更新
IQuery updateQuery = this.Session.CreateQuery("update TransferItem set Status = :newStatus where Status = :oldStatus")
.SetParameter("oldStatus", DownloadStatus.Active)
.SetParameter("newStatus", DownloadStatus.Queued);
updateQuery.ExecuteUpdate();
NHibernate的應用配置的映射來創建並運行下面的SQL的一個例子:
update cms_TransferItem set [email protected] where [email protected]
下面是批量刪除的示例
IQuery deleteQuery = this.Session.CreateQuery("delete TransferItem ti WHERE ti.Status = :statusToGo")
.SetParameter("statusToGo", DownloadStatus.Completed);
deleteQuery.ExecuteUpdate();
,其執行這樣的SQL:
delete from cms_TransferItem where [email protected]
你可能會問,如果你有一個查詢語言的工作,爲什麼不只是寫原始SQL?當您使用HQL時,您正在使用其餘.NET代碼正在處理的概念性業務對象。 ORM工具的好處在於,對於大部分代碼來說,數據庫表和對象映射都是抽象出來的。使用HQL,您將繼續與對象層交互,而不是直接與數據庫表交互。
有趣的,但遺憾的是,在我的情況下,這是行不通的,因爲我們正在使用通用的存儲庫模式。這個想法是在數據庫更新或刪除時應用一個自定義函數調用。有一種方法可以通過簡單的'session.SaveOrUpdate'或者'session.Delete'調用嗎? (對於每次刪除或更新,過濾器會生成如下內容:'Where IsOperationAllowedFromUser(:userId,:itemId)') – 2014-09-19 13:08:30
@ Sam9291 IsOperationAllowedFromUser是SQL函數還是.NET函數? – 2014-09-19 21:12:08
這將是一個SQL函數 – 2014-09-21 11:52:29