如何在NHibernate中有效地按ID删除对象?

如何在NHibernate中有效地按ID删除对象?,nhibernate,Nhibernate,我们使用NHibernate作为服务器端的ORM 有时,需要从数据库中删除一个对象,只需给出该对象的类型和ID。此外,删除的对象以前没有获取(因此它不在会话缓存或其他任何地方) 无论如何,我使用的是ISession.Delete(query)重载,其中的查询与Id=5的Dummy中的一样简单 我的问题是为什么NHibernate在删除对象之前先获取它?据我所知,我正在为一次操作支付到服务器的双程往返费用,直觉上应该只需要一次往返 是否有一种方法可以通过NHibernate按对象的类型和ID从数据

我们使用NHibernate作为服务器端的ORM

有时,需要从数据库中删除一个对象,只需给出该对象的类型和ID。此外,删除的对象以前没有获取(因此它不在会话缓存或其他任何地方)

无论如何,我使用的是
ISession.Delete(query)
重载,其中的查询与Id=5的Dummy中的
一样简单

我的问题是为什么NHibernate在删除对象之前先获取它?据我所知,我正在为一次操作支付到服务器的双程往返费用,直觉上应该只需要一次往返


是否有一种方法可以通过NHibernate按对象的类型和ID从数据库中删除对象,这样只需一次往返?

您也可以使用HQL自己删除它

session.CreateQuery("delete from Table where id = :id")
     .SetParameter("id", id)
     .ExecuteUpdate();

但这不会级联删除,我认为这是它需要首先加载的原因之一

如果调用
ISession.Delete(Session.Load(type,id)),它真的会影响数据库吗由于Load()应该返回一个代理,而不是命中db?

是的,我猜delete函数必须以触发Load的方式访问代理。我至少可以确认,如果lazy Load已关闭,Load仍会首先进行选择。我还没有尝试为类启用延迟加载,看看这是否有帮助。。。