.net 混合存储过程业务逻辑和ORM

.net 混合存储过程业务逻辑和ORM,.net,stored-procedures,orm,architecture,migration,.net,Stored Procedures,Orm,Architecture,Migration,我工作的公司开发了一个几乎完全基于存储过程的大型应用程序 我们使用经典的ASP和SQL Server,业务逻辑的主要部分包含在这些存储过程中 例如,(我知道,这很糟糕…)单个存储过程可以用于不同的目的(插入、更新、删除、进行一些计算…)。大多数情况下,存储过程用于相关表上的操作,但情况并非总是如此 我们计划在不久的将来转向ASP.NET(WebForms) 我读过很多关于StackOverflow的帖子,建议我将业务逻辑移到数据库之外。 问题是,我试图说服我们公司的决策者,而我无法改变他们的想法

我工作的公司开发了一个几乎完全基于存储过程的大型应用程序

我们使用经典的ASP和SQL Server,业务逻辑的主要部分包含在这些存储过程中

例如,(我知道,这很糟糕…)单个存储过程可以用于不同的目的(插入、更新、删除、进行一些计算…)。大多数情况下,存储过程用于相关表上的操作,但情况并非总是如此

我们计划在不久的将来转向ASP.NET(WebForms)

我读过很多关于StackOverflow的帖子,建议我将业务逻辑移到数据库之外。 问题是,我试图说服我们公司的决策者,而我无法改变他们的想法

因为我希望能够利用面向对象编程的优点,所以我希望将表映射到实际的类。 到目前为止,我的解决方案是使用ORM(Entity Framework 4或nHibernate)来避免手动映射对象(主要用于检索数据) 并使用某种数据访问层调用现有的存储过程(用于保存)

我想听听你的意见。 你认为这是个好办法吗?有什么想法吗


编辑:我是否应该使用标准的DataTable/DataRow方法?

我认为这是一个很好的解决方案。如果您不仔细检查触发器对表数据的作用,请小心可能会产生的副作用


另一方面,对于某些类型的应用程序,我仍然认为在数据库端使用业务逻辑是一个非常好的解决方案。将其从数据库中删除并不总是最佳选择。有很多事情要考虑。

< P> <强>我的观点< /强>

存储过程是您的朋友,原因很多。我强制执行项目中存储过程中的所有db操作,并锁定SQL server上应用程序的帐户,只允许它执行存储过程(没有任何类型的直接表访问)。尽管如此,在同一个过程中混合更新/删除给我的印象是糟糕的做法(尽管我倾向于在同一个过程中组合插入/更新)

另外请注意:存储过程中的任何逻辑都不必在从ASP移动到ASP.NET时重新实现,因为它存在于web代码之外+将查询保留在其所属位置得100分

现在常见的“智慧”表明,您应该只将数据库服务器用作对象存储,我强烈反对这一点。我有几个项目,在服务多年后,突然需要与其他用不同语言编写的应用程序共享数据和逻辑。将大多数数据库代码实际放在数据库中,并放在应用程序代码之外,这使得这一点非常简单,并且最大限度地减少了项目之间的代码重复

将ORM与存储的PROC混合在一起听起来是一种在年轻时减肥和头发的好方法


将现有应用程序从当前的数据模型切换到ORM,再加上从ASP移动到ASP.NET MVC的复杂性,会给已经具有挑战性的任务增加很多变量和失败点。如果你不能向权威提出一个令人信服的论点,即ORM是一个好主意,你可能会问自己这是为什么

面向对象编程的优点是什么

当人们谈论OOP的优点时,他们通常意味着集中业务逻辑或围绕相关操作和数据构建有意义的抽象。将业务逻辑放在存储过程中会破坏这些抽象并分散业务逻辑

如果你的团队打算保持业务逻辑过程,你至少应该考虑保持这样的方式:让你的代码程序化,所以只有一个地方寻找你的逻辑。


话虽如此,使用ORM将您的数据映射到(没有任何重要行为或逻辑)以便在您的网站中使用是非常常见的。Dino Esposito很好地回答了您的问题,只需将存储过程视为服务层即可。

这完全取决于业务需要。存储过程中有多少业务逻辑,以及多个存储过程之间建立业务工作流的依赖关系都很重要

可伸缩性受到很大影响。当进程等待完成时,依赖逻辑会阻止CPU的使用。并行化对于服务驱动的体系结构很重要,在这种体系结构中,数据库基本上需要读缓存来提高性能。为什么要打破一个CPU盒,阻塞和阻塞工作流,而工作流可以分布在哪里


我认为参数必须考虑到这些因素,而且在任何年龄都不会掉头发。

您仍然可以通过ORM调用PROC。@ScottE:我知道,但是如果sp中的参数没有映射到类成员,它会工作得很好吗?我们使用一个奇怪的串接字符串过程,只将一个参数传递给sp(例如:“^custid=123^custname=blabla^adress=1000 1st avenue”),然后在sp中解析它。主要是继承,以便能够重用当前重复的代码。我们为客户进行了大量定制,为系统的基本行为添加了功能。+1表示“没有任何类型的直接表访问”-我无法告诉您我有多少次进入项目,听到了被掠夺数据的恐怖故事,因为应用程序有可利用的漏洞,同时完全可以读取每个表。DB开发人员/管理员必须假设应用程序是可利用的,并采取必要措施锁定所有数据。狂欢节就是你如何把它放下的。然而,根据我的经验,使用ORM/code generator访问存储过程节省了大量时间,是一件好事(EF用于.Net和SQL Server;PGFUNC2HP用于Postgresql和PHP)