如何在nhibernate中使用PK删除对象?

如何在nhibernate中使用PK删除对象?,nhibernate,Nhibernate,如何在不首先从数据库获取对象的情况下删除对象 在另一个ORM中,我可以这样做: session.Delete<User>(1); // 1 = PK 会话。删除(1);//1=PK 检查IQuery对象上的ExecuteUpdate方法 IQuery q = session.CreateQuery ("delete from User where Id = 1"); q.ExecuteUpdate(); 应该删除对象而不立即检索它。您可以这样做 User user = new U

如何在不首先从数据库获取对象的情况下删除对象

在另一个ORM中,我可以这样做:

session.Delete<User>(1); // 1 = PK
会话。删除(1);//1=PK
检查IQuery对象上的ExecuteUpdate方法

IQuery q = session.CreateQuery ("delete from User where Id = 1");
q.ExecuteUpdate();
应该删除对象而不立即检索它。

您可以这样做

User user = new User();
user.Id = 1;
session.Delete(user);
试试这个:

var user = session.Load<User>(1);
session.Delete(user);
var user=session.Load(1);
删除(用户);

Load
将为设置了标识符的用户对象创建代理。我不确定在删除对象之前,
Delete
是否会从数据库中加载该对象,目前无法对其进行测试。

将以下类添加到项目中:

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();
    }
}
公共静态类SessionHelper
{
公共静态无效删除(此ISession会话,对象id)
{
var queryString=string.Format(“删除{0},其中id=:id”,
类型(张力);
会话.CreateQuery(queryString)
.SetParameter(“id”,id)
.ExecuteUpdate();
}
}

您现在可以使用
会话。删除(1)

在第2版之前没有方法。
在第2版之后,在
IQuery
上有
ExecuteUpdate()
方法,在
ISession.Delete()上有一个重载方法,它接受一个定义删除查询的字符串

Load is not Get!Load只是为实际对象创建一个代理。它只是一个带有Id的框。Get实际上从数据库加载记录。所以,不,只要你只读取id属性,它就不会从数据库“实际”加载任何内容。加载不会像你说的那样加载用户。但删除将始终有效。如果我的主键列的名称与“id”不同,这也会起作用吗?@ajyes
id
是一个表示实体id的特殊名称。请参阅。为什么不干脆
session.Delete(session.Query().FirstOrDefault(c=>c.id==id))?@HristoYankov这是额外的,不必要的query@HristoYankovFirstOrDefault执行查询。但NHibernate 5确实提供了一种通过LINQ扩展一次性删除的方法。2010年也许是这样,但现在有更多更好的选择well@LuisFilipe:那些是。。。??