这是我个人的看法。我相信其他人可能有不同的。既然你在问这个问题,我希望你愿意讨论,否则我不会打扰,因为这个话题就像一个宗教讨论,因为很多人都有非常强烈的意见并且不太可能改变它们。
就我个人而言,我不认为存储过程是用来编写业务逻辑的。它们应该用于编写数据访问逻辑。如果我想优化昂贵的查询(例如动态搜索),我只会使用存储过程,但仅此而已。如果你在域模型中有你的逻辑,你的性能会稍差一些,但在大多数情况下它甚至不明显。
在存储过程中编写业务逻辑的有力论据之一是,您可以通过更改存储过程轻松更改某些逻辑。但是我们真的应该在没有进行适当测试的情况下更改已部署应用程序的业务逻辑吗?如果你不小心犯了错误会发生什么?对于持续构建,现在进行部署并不是什么大问题,我认为作为一名专业开发人员,您不应该冒这个风险。
当您决定在存储过程中编写逻辑时,您放弃了所有面向对象的概念,并最终编写了一些我们可能在 10 年前编写的过程代码。C# 语言现在已经走了很长一段路,您将无法在应用程序的核心(即业务逻辑)中使用这些新的语言功能。您还失去了 Visual Studio 功能来重构代码、高级和简单的调试功能等。
我也不喜欢有触发器的想法,因为它在源代码中不可见。想象一下,您团队中的某个新成员试图在一段时间后添加一个新功能,如果他不知道触发器存在,他可能会编写一些不正确的逻辑。
如果您的应用程序包含一些复杂的业务逻辑,(我相信大多数应用程序都这样做)您应该有一个域模型,它不仅包含实体的属性,还包含您的逻辑。否则,您将陷入称为贫血数据模型的反模式。
如果您的逻辑在存储过程中,您将无法通过编写单元测试来测试您的业务逻辑。
如果您的站点真正成功,您也无法将业务逻辑部署到多个服务器,如果您将它们存储在存储过程中。
如果您的存储过程中包含所有逻辑,您也不会使用实体框架和 LINQ 的所有强大功能。如果这是您要采用的方法,您实际上不需要 ORM 映射器。
这是我会为您的项目推荐的。即使您已经拥有数据库,您仍然可以使用实体框架的代码优先方法。您可以下载 EF 代码优先逆向工程电动工具,并为您自动生成代码优先代码。这将是一次性的事情,之后如果您有更多更改,您可以直接对数据库进行操作并相应地更新代码优先代码。Fluent API 一开始有点令人困惑,但您可以从生成的代码中轻松了解这一点。
不要从控制器访问您的数据上下文。拥有一个包含所有数据访问逻辑的存储库层。您可以从控制器访问存储库。(这允许您通过模拟存储库来对代码进行单元测试)。在 asp.net 网站上有很多关于如何使用存储库模式的视频教程。
您的域模型将是从实体框架生成的实体。尝试在这些模型中包含您的业务逻辑。使用域模型模式需要一点时间。但是一旦你习惯了它,你就会开始欣赏它的好处。
希望这可以帮助。