2010-06-17 84 views

回答

25

添加下面的類到您的項目:

public static class SessionHelper 
{ 
    public static void Delete<TEntity>(this ISession session, object id) 
    { 
     var queryString = string.Format("delete {0} where id = :id", 
             typeof(TEntity)); 
     session.CreateQuery(queryString) 
       .SetParameter("id", id) 
       .ExecuteUpdate(); 
    } 
} 

現在可以使用session.Delete<User>(1)

+1

如果我的主鍵列的名稱與「id」不同,這也可以工作嗎? – 2016-11-25 13:17:54

+0

@A_J是的。 'id'是一個特殊的名字,代表了entitiy的id。請參閱http://nhibernate.info/doc/nhibernate-reference/queryhql.html#queryhql-where。 – 2016-11-25 14:48:22

+0

爲什麼不只是'session.Delete(session.Query ().FirstOrDefault(c => c.Id == id));'? – 2017-12-01 08:12:08

2

時退房IQUERY對象的executeUpdate方法。

IQuery q = session.CreateQuery ("delete from User where Id = 1"); 
q.ExecuteUpdate(); 

應該刪除對象而不檢索它afaik。

6

你能做到這一點

User user = new User(); 
user.Id = 1; 
session.Delete(user); 
3

試試這個:

var user = session.Load<User>(1); 
session.Delete(user); 

Load將創建與標識設置用戶對象的代理。我不確定在刪除它之前Delete是否會從數據庫加載對象,而我目前無法對其進行測試。

+1

恐怕它會加載它。 – 2010-06-17 19:49:39

+0

負載沒有得到!加載只是爲實際對象創建一個代理。這只是一個帶有Id的盒子。實際上從數據庫中加載記錄。所以,不,它不會「實際」從db中加載任何東西,只要你只讀取id屬性即可。 – 2016-02-03 06:56:32

+0

正如你所說的,「加載」不會加載用戶。但刪除將永遠。 – Junior 2016-11-18 14:25:18

0

在版本2之前沒有辦法。 在版本2之後,您在IQuery上有ExecuteUpdate()方法,並且在ISession.Delete()上有一個重載方法,它接受定義刪除查詢的字符串

+0

也許在2010年是真的,但現在有更多更好的選擇以及 – 2017-09-22 15:42:28

+0

@LuisFilipe:那些是......? ? – 2017-11-06 22:42:15