我正在研究我的第一个真正的asp.net Web应用程序,我有点陷入陷阱和处理数据库约束违规的最佳位置和方法。假设我对列有唯一约束,并且用户输入会违反该唯一约束的内容。我是否通过调用数据库来检查该列是否存在该值,是否在业务层中捕获它,还是让它一直到数据库并让它抛出异常并在我的应用程序中处理它?
我不喜欢后一种答案 - 因为在业务层到达数据库之前尽可能多地处理它是有意义的。但它也有些问题,因为我的应用程序是由在所有表上实现基本CRUD操作的过程驱动的。因此,为了让我在业务层中强制执行唯一性,我需要为每个可能的约束创建一个过程,以便我可以在更新或插入之前进行查找。这看起来很乏味......我正在复制业务规则,因为它们存在于数据库和业务层中,所以如果有变化,我不仅需要更改数据库,而且我必须更改过程和应用程序代码。
在应用程序代码中是否有正确的方法或好的方法来强制执行这些数据库约束,或者我应该考虑一种方法来捕获数据库抛出的异常并以用户友好的方式呈现它们?
答案 0 :(得分:2)
后一个答案是正确的。如果您尝试在前端应用程序中首先执行所有操作,那么使用数据库约束的目的是什么?
整个约束点是拥有一个中心位置(数据库服务器),以一致的方式处理尽可能多的数据验证,而不管数据在何处/何处到达。在前端应用程序中重复编写相同的逻辑是多余的,并且不必要地复杂。如果DB中的约束发生了某些变化(你的应用认为应该有效的东西不再是这样)会怎么样?无论如何,你得到了一个例外。
让DB处理验证约束,并处理代码中的异常。这允许您使用的所有方法来访问和更新数据,因为数据库会处理它。如果有变化,您可以使用新约束更新数据库,并且您的应用程序会自动同步。
答案 1 :(得分:0)
我同意后者给出了您如何使用数据库的描述。非常重要的是要意识到,即使您在执行更新/插入之前从业务层调用了每一个可能的约束违规,一秒钟之后,由于其他用户和您的更新/的请求,数据库状态可能会发生变化插入仍然可能失败。