2010-10-07 23 views
1

我想实现一个只使用主键来删除实体的存储库方法,主要是因为从一个webapp我通常只在调用“删除请求”时知道主键一个网页。只能通过主键删除NHibernate中的实体

由于ORM,今天的选项是从数据库中获取实体,然后删除它,这给了我一个额外的往返。

我可以使用HQL删除,但因为我想为所有实体创建一个通用的删除方法,除非我使用反射来找出哪个字段是主键(可以,但不能感觉正确)。

或者它是否需要实体才能正确处理级联的NHibernate性质?

我试过这种方法,假设它不会加载实体,除非明确需要,但是还没有时间来测试它。也许有人可以阐明如何处理这个问题?

var entity = session.Load<T>(primaryKey); 
session.Delete(entity); 

编辑:现在已经测试过它,它似乎还没有完全选择删除前的实体。

+1

可能重复[如何删除对象通过在nhibernate中使用PK?](http://stackoverflow.com/questions/3063777/how-to-delete-an-object-by-using-pk-in-nhibernate) – 2010-10-07 14:26:06

回答

2

Load可能会返回代理对象,但不能保证。您的映射可能包含级联删除,这将强制NHibernate从数据库加载对象,以确定如何删除对象及其图形。

我会实现这个使用负载,因为你在做什么。对于一些对象,NHibernate可能不需要首先进行选择。在这种情况下,这是您使用o/r映射器支付的[通常]微不足道的代价。

+0

我一直在试图弄清楚它何时会返回一个代理对象。你知道它是否只返回被定义为“懒惰”的类的代理? – jishi 2010-10-07 13:26:55

+0

我不知道,但我的猜测是,如果映射包含任何级联设置,它将加载对象。这是一个很好的功能 - 您无需担心清理相关对象。除非出现性能问题,否则我会忍受这种行为。通过主键加载对象通常是非常快速的操作。 – 2010-10-07 16:02:02

1

nHibernate是一个O(bject)RM。我同意你可能需要解决依赖关系的对象。

你当然可以使用直接的ADO.Net调用来删除你的对象。这当然会带来自己的问题,因为您必须自己处理任何级联问题。如果你走这条路,不要忘记从nHibernate会话中逐出使用这种方法删除的任何对象。

但是,如果这个删除是在你的系统的一个非常敏感的部分,那可能是要走的路。

虽然情况确实如此,但我仍然百分百确信。扔掉所有的nHibernate给你,因为这不会是明智的。

我明白你知道这一点,你正在寻找一个严格的nHibernate的答案,我不认为它存在,对不起。

1

声明:我目前无法对其进行测试。但不会跟随的东西帮助:

Person entity = new Person(); 
entity.Id = primaryKey; 
session.Delete(entity); 

不加载实体,但建立只有主键的实体。我会喜欢测试它,但现在我的环境无法正常工作。

+0

这可能会起作用,但它可能会拒绝删除与会话不相关的对象。对于我来说问题并非所有实体都有。作为主要关键,我需要反思以找出哪些是什么,而不是我认为的一个漂亮的解决方案。 (还是)感谢你的建议。 – jishi 2010-10-07 13:29:04