在某些情况下,ORM 附加计算列

本文关键字:计算 ORM 情况下 | 更新日期: 2023-09-27 18:34:22

我正在使用最新版本的NHibernate,最近偶然发现了一个有趣的问题。

假设我有一个名为"配置文件"的表,我希望接收所有配置文件的列表。但是,有了它,我有一个名为 CanDelete 的计算列,如果(例如(正在使用配置文件,则禁止删除配置文件。

但是,此CanDelete计算列不是我的实体的一部分,我不想在这种情况下只需要CanDelete值时污染实体 - 并且为每个配置文件单独计算它太慢了。

NHibernate中有没有办法执行一些查询并将该查询的行作为对象获取,然后以某种方式获取额外的计算列?

假设我使用的是 N 层体系结构。在表示层中,我一直需要一个所有配置文件的列表(对于每个配置文件,我是否可以删除它(。我的业务逻辑层和数据访问层是什么样的?

现在在我的存储库中,我有一个GetProfiles方法,然后是一个CanDeleteProfile方法,我为每个获取的配置文件运行该方法。但就像我上面提到的,它实在太慢了。我可以创建一个GetProfilesWithCanDeleteStatus方法,但这需要我创建一个带有该计算列的专用实体。

当我不想在我的

配置文件列表中达到O(n^2)性能时,您对如何以正确的方式构建它有什么建议?我想避免 n+1 问题。

我不一定在寻找NHibernate解决方案

(我标记了NHibernate,因为它可能有一些针对此类事情的特定工具(,并且欢迎其他ORM的一般解决方案。

在某些情况下,ORM 附加计算列

我有一个可能对你有好处的想法,但它不是一个完美的主意,因为你设计程序的每种方式都有它的缺点。

我建议您CanDelete更改该列的定义,使其就像该实体中的任何其他列(未在运行时计算(和布尔类型一样,但不会损坏要求。

通过这样做,它将像来自数据库的任何其他简单Select一样 - 这非常快。

现在,棘手的部分是确保该列将指示(在需要的任何时间(是否使用它(以及是否可以删除(。

因为我不知道您是否使用(并且可以删除(配置文件实体的计算方式,所以很难准确判断如何设计 DAL 和 BL,但指南是:在所有其他位置,您更改数据库(该实体或其他实体(中的状态,这可能会更改您使用函数封装的列CanDelete再次计算该值以验证其状态并在需要时进行更改。

如果您确保每次在 BL 中更改计算CanDelete的列之一时,请确保列CanDelete始终为真指示。

这种方法的缺点是:1. 它为程序员在需要时不使用封装函数的错误打开了位置。2.假设此应用程序是唯一更改此数据库的应用程序。3. 在插入来自管理工作室或脚本的原始数据时,您必须小心。

我希望这对你的BL有好处。