2010-06-17 90 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