我正在尝试实现一个存储库方法,仅使用主键删除实体,主要是因为从webapp我通常只在从网页调用“删除请求”时才知道主键。
由于ORM,今天的选项是从数据库中获取实体,然后删除它,这给了我额外的往返。
我可以使用HQL删除,但是因为我想为所有实体创建一个通用删除方法,除非我使用反射来找出哪个字段是主键(可行,但感觉不到)正确的)。
或者NHibernate的性质是否需要实体才能正确处理级联?
我尝试了这种方法,假设除非明确需要,否则它不会加载实体,但是还没有时间测试它。也许有人可以阐明如何处理这个问题?
var entity = session.Load<T>( primaryKey );
session.Delete( entity );
编辑:现在已经对它进行了测试,似乎在删除之前它仍然在实体上进行完全选择。
答案 0 :(得分:2)
Load
可能会返回代理对象,但无法保证。您的映射可能包含级联删除,这将强制NHibernate从数据库加载对象,以确定如何删除对象及其图形。
我会像你一样使用Load来实现它。对于某些对象,NHibernate可能不需要先进行选择。如果是这样的话,那就是使用o / r映射器所付出的[通常]微不足道的价格。
答案 1 :(得分:2)
之前已经问过并回答过:How to delete an object by using PK in nhibernate?
我甚至有两篇关于它的博客文章:
答案 2 :(得分:1)
nHibernate是一个O(对象)RM。我同意你的意见,它可能需要对象来解决依赖关系。
您当然可以使用直接ADO.Net调用来删除对象。这当然会出现问题,因为你必须自己处理任何级联问题。如果您沿着这条路前进,请不要忘记使用此方法从nHibernate会话中删除您删除的任何对象。
但是,如果此删除属于系统的一个非常敏感的部分,那么可能就是这样。
尽管如此,我还是100%肯定。抛弃所有nHibernate给你,因为这是不明智的。
我理解你知道这一点,并且你正在寻找一个严格的nHibernate答案,我认为它不存在,抱歉。
答案 3 :(得分:1)
免责声明:我目前无法对其进行测试。但是不会关注事情:
Person entity = new Person();
entity.Id = primaryKey;
session.Delete( entity );
不要加载实体,而是构建仅具有主键的实体。我本来喜欢测试它,但现在我的环境无法正常工作。