5

我有一个用户表,它对用户名有一个唯一约束(原因很明显)。

我正在使用 EF 4.0 DAL 来填充数据库,并在编写 CreateUser() 方法的过程中。

是吗...

  1. 如果我尝试插入已经存在的用户名,最好捕捉抛出的 SqlException。
  2. 在尝试将用户名插入数据库之前显式检查用户名?

如果你也能说出原因,那就太好了!

4

4 回答 4

3

我会先检查记录是否存在。唯一键约束有助于防止您的应用程序首先允许“坏”数据通过的可能方式,但不是主要的停止方式。当可以避免时,将异常用作控制流机制(在这种情况下为验证)通常是一个坏主意。

编辑:为避免混淆,我并不是说根本没有唯一索引。它应该在那里,但它不应该是检查唯一性的主要方法。

于 2010-11-05T03:06:29.540 回答
2

我会说最好处理异常。该数据库旨在处理用户名的唯一性,因此我想它可以比您更有效地完成它。它还为您的系统增加了可移植性和凝聚力。如果您在多个地方添加用户,您将不得不重复用户名检查或创建一种方法,基本上您最终将重写数据库引擎已经编写的内容。

于 2010-11-05T03:07:07.067 回答
1

除了塞缪尔所说的之外,您还需要确保在您的支票和将记录添加到数据库之间没有人输入可能与您的记录冲突的记录。您可以使用锁来实现这一点,但是您必须捕获由锁引起的异常。

至于在业务规则和数据库中复制内容,我赞成数据库在需要时尽可能多地进行一致性检查,即使这确实复制了业务层中的某些内容。您的数据库对无效数据的锁定越严密越好。它可以防止您通过应用程序以外的其他工具访问您的数据库,例如支持人员使用 SSMS 在数据库中进行更改以纠正用户报告的数据问题。

于 2010-11-05T10:02:46.093 回答
0

我赞同塞缪尔所说的话。最有效的方法是将其留给数据库。所有其他选项都更耗费时间和资源......

于 2010-11-05T03:19:37.233 回答