Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在某些情况下,是否需要额外的计算列?_C#_Nhibernate_Orm - Fatal编程技术网

C# 在某些情况下,是否需要额外的计算列?

C# 在某些情况下,是否需要额外的计算列?,c#,nhibernate,orm,C#,Nhibernate,Orm,我正在使用NHibernate的最新版本,最近我偶然发现了一个有趣的问题 假设我有一个名为Profile的表,我希望收到我所有配置文件的列表。然而,有了它,我就有了一个名为CanDelete的计算列,它禁止删除(例如)正在使用的概要文件 但是,这个CanDeletecomputed列不是我的实体的一部分,我不想在这个场景中只需要CanDelete值时污染实体,并且为每个配置文件单独计算它太慢了 在NHibernate中是否有一种方法可以执行一些查询,并将该查询的行作为对象获取,然后以某种方式获取

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

假设我有一个名为Profile的表,我希望收到我所有配置文件的列表。然而,有了它,我就有了一个名为
CanDelete
的计算列,它禁止删除(例如)正在使用的概要文件

但是,这个
CanDelete
computed列不是我的实体的一部分,我不想在这个场景中只需要
CanDelete
值时污染实体,并且为每个配置文件单独计算它太慢了

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

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

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

当我不想在我的配置文件列表中点击
O(n^2)
performance时,您对如何以正确的方式构建这个有什么建议?我想避免n+1问题


我不一定要寻找NHibernate解决方案(我给NHibernate加上标签,因为它可能有一些用于这类事情的特定工具),也欢迎其他ORM的通用解决方案。

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

我建议您更改该列
CanDelete
的定义,使其与该实体中的任何其他列一样(不是在运行时计算的),并且类型为Boolean,但不会损害需求

这样做就像从db中选择任何其他简单的
一样,非常快速

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

因为我不知道如果使用了配置文件实体(并且可以删除),那么计算的方式是什么,所以很难准确地告诉您如何设计DAL和BL,但指导原则是: 在每一个其他地方,您都会更改(该实体或其他实体的)DB中的一个状态,该状态可能会更改列
CanDelete
,您使用一个函数封装该值,以再次计算该值,验证其状态,并在需要时更改它

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

这种方法的缺点是: 1.它为程序员在需要时不使用封装函数的错误打开了一个空间。 2.假设此应用程序是唯一更改此数据库的应用程序。 3.您必须小心从ManagementStudio或脚本插入原始数据


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

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

我建议您更改该列
CanDelete
的定义,使其与该实体中的任何其他列一样(不是在运行时计算的),并且类型为Boolean,但不会损害需求

这样做就像从db中选择任何其他简单的
一样,非常快速

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

因为我不知道如果使用了配置文件实体(并且可以删除),那么计算的方式是什么,所以很难准确地告诉您如何设计DAL和BL,但指导原则是: 在每一个其他地方,您都会更改(该实体或其他实体的)DB中的一个状态,该状态可能会更改列
CanDelete
,您使用一个函数封装该值,以再次计算该值,验证其状态,并在需要时更改它

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

这种方法的缺点是: 1.它为程序员在需要时不使用封装函数的错误打开了一个空间。 2.假设此应用程序是唯一更改此数据库的应用程序。 3.您必须小心从ManagementStudio或脚本插入原始数据

我希望这对你的BL有好处