仅通过主键删除NHibernate中的实体

时间:2010-10-07 10:27:30

标签: c# nhibernate

我正在尝试实现一个存储库方法,仅使用主键删除实体,主要是因为从webapp我通常只在从网页调用“删除请求”时才知道主键。

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

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

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

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

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

编辑:现在已经对它进行了测试,似乎在删除之前它仍然在实体上进行完全选择。

4 个答案:

答案 0 :(得分:2)

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

我会像你一样使用Load来实现它。对于某些对象,NHibernate可能不需要先进行选择。如果是这样的话,那就是使用o / r映射器所付出的[通常]微不足道的价格。

答案 1 :(得分:2)

答案 2 :(得分:1)

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

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

但是,如果此删除属于系统的一个非常敏感的部分,那么可能就是这样。

尽管如此,我还是100%肯定。抛弃所有nHibernate给你,因为这是不明智的。

我理解你知道这一点,并且你正在寻找一个严格的nHibernate答案,我认为它不存在,抱歉。

答案 3 :(得分:1)

免责声明:我目前无法对其进行测试。但是不会关注事情:

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

不要加载实体,而是构建仅具有主键的实体。我本来喜欢测试它,但现在我的环境无法正常工作。