gpt4 book ai didi

nhibernate - 如何在 nhibernate 中删除只有其 id 和类型的实体?

转载 作者:行者123 更新时间:2023-12-03 12:33:52 27 4
gpt4 key购买 nike

我想知道如何使用 NHibernate 2.1 删除只有其 ID 和类型(如映射)的实体?

最佳答案

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

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

使用 NH 2.1,您可以使用 HQL。不知道它实际上是什么样子,但像这样: 请注意,这会受到 SQL 注入(inject)的影响 - 如果可能,请使用参数化查询而不是 SetParameter()
session.Delete(string.Format("from {0} where id = {1}", type, id));

编辑:

对于 Load,您不需要知道 Id 列的名称。

如果需要了解,可以通过 NH 元数据获取:
sessionFactory.GetClassMetadata(type).IdentifierPropertyName

另一个编辑。

session.Delete()正在实例化实体

使用 session.Delete() 时,NH 无论如何都会加载实体。一开始我不喜欢它。然后我意识到了优势。如果实体是使用继承、集合或“任何”引用的复杂结构的一部分,它实际上更有效。

例如,如果类 AB都继承自 Base ,它不会尝试删除表 B 中的数据当实际实体的类型为 A 时.如果不加载实际对象,这是不可能的。当有许多继承类型且每个类型还包含许多附加表时,这一点尤其重要。

当你有一个 Base 的集合时,也会出现同样的情况。 s,恰好是 A 的所有实例.当将集合加载到内存中时,NH 知道它不需要删除任何 B -东西。

如果实体 A收藏了 B s,其中包含 C s(等等),它不会尝试删除任何 C s当集合 B s 为空。这只有在阅读集合时才有可能。当 C 语言本身很复杂、聚合更多的表等时,这一点尤其重要。

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

HQL 删除有陷阱

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

在简单的结构中,这可能运作良好且有效。在复杂的结构中,并非所有内容都被删除,从而导致违反约束或“数据库内存泄漏”。

结论

我还尝试使用 NH 优化删除。在大多数情况下我都放弃了,因为 NH 仍然更聪明,它“正常工作”并且通常足够快。我编写的最复杂的删除算法之一是分析 NH 映射定义并从中构建删除语句。而且 - 毫不奇怪 - 在删除之前不从数据库中读取数据是不可能的。 (我只是将其缩减为仅加载主键。)

关于nhibernate - 如何在 nhibernate 中删除只有其 id 和类型的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1323427/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com