我想知道一个人如何可以删除具有只是它的ID和类型的实体(如在映射)使用NHibernate 2.1?

有帮助吗?

解决方案

如果您使用的延迟加载,加载只创建一个代理。

session.Delete(session.Load(type, id));

使用NH 2.1可以使用HQL。不知道它是如何真正的样子,但这样的事情:注意,这是受到SQL注入 - 的如果有可能使用参数化查询与替代的setParameter()

session.Delete(string.Format("from {0} where id = {1}", type, id));

修改

有关负载,你不需要知道ID列的名称。

如果您需要了解它,你可以通过NH元获得它:

sessionFactory.GetClassMetadata(type).IdentifierPropertyName

另一个编辑。

<强> session.Delete()被实例化所述实体

当执行Session.delete(),NH反正加载的实体。起初我不喜欢它。然后我意识到的优势。如果实体是使用继承,集合或“任何” -references复杂结构的一部分,它实际上更有效的是。

例如,如果类AB无论从Base继承,它并不试图在表B删除数据时的实际实体是类型A的。这不是没有加载的实际对象是可能的。当有许多遗传类型还包括许多附加的台,这是特别重要的每

当你有Bases,这恰好是A的所有实例的集合相同的情况给出。当加载在内存中的集合,NH知道它并不需要删除任何B-东西。

如果实体A具有Bs的集合,它包括Cs(等等),它并没有试图删除任何Cs时Bs的集合为空。读取集合时,这是唯一可行的。这是特别重要的,当C是其自身的配合物,聚集甚至更多的表等。

在更复杂和动态的结构是,更有效的是它加载,而不是“盲目地”删除它的实际数据。

<强> HQL删除有缺陷

HQL删除不数据加载到存储器中。但HQL,删除不那么聪明。他们基本上是实体名称转换为相应的表名,并从数据库中删除。此外,它会删除一些聚合集合数据。

在简单的结构中,这可以很好地工作,高效。在复杂的结构,而不是一切都被删除,从而导致违反约束或“数据库内存泄漏”。

<强>结论

我也试图与NH优化删除。我在大多数的情况下放弃了,因为NH仍是聪明,它“只是工作”,通常是速度不够快。其中最复杂的删除算法我写的是分析NH映射定义和构建删除的语句。和 - 毫不奇怪 - 这是不可能的,但不删除之前,从数据库中读取数据。 (I只是降低它只加载主键。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top