asp.net mvc避免重复

问题描述:

我有一个用户表,其中没有两个相同的用户可以存在,什么是最好的方式来做这个错误免费?asp.net mvc避免重复

我所做的是我在控制器中写了一个重复检查,但有人对我说这是不对的。他说把独特的数据库表?我也在其他几个控制器上实现了这一点。我应该改变它吗?

+0

我忘记提及我正在使用LINQ到sql – maztt 2010-11-16 11:57:52

有几个地方你应该这样做。

  • 在数据库表级别:使用电子邮件作为用户名和标记为唯一constrant
  • 在模型验证水平,你可以检查电子邮件,并在客户端返回验证错误
  • ,你可以放置一些代码使用异步请求时,用户在文本框中输入用户名

,将检查用于实时重复的电子邮件或用户名 - 编辑 -

,建议在把所有三个更好的验证。不一致的数据对于您的系统来说是最糟糕的事情。因为我认为是的,正确的数据=质量好

- 编辑完 -

请记住,验证代码应放在模型,并学习如何编写管理的面向对象的代码,你可以看到例如的mvc store front

希望这将有助于

+1

客户端方法很好,但很容易导致从您那里获取用户或他们的电子邮件数据库,所以我不会推荐它。 – Migol 2010-11-16 11:53:02

+0

@Molol,同意你的意见。有很多方法可以预防它,但是你是对的,你应该牢记这一点 – 2010-11-16 11:58:15

+0

如果你希望在整个代码中冒出错误信息,那么Db约束对于完成这种类型的工作是非常糟糕的。所有东西都依赖于某种类型的“错误信息”服务。 – jfar 2010-11-16 13:17:07

最好就是在数据库级别,执行你的数据限制在可能的情况。考虑以下情况:

2请求在同一时间创建具有相同名称的用户。

  1. 请求1检查数据库,看看是否存在 - 用户不;
  2. 不久之后,请求2检查数据库以查看是否存在 - 用户没有;
  3. 请求1创建此用户。
  4. 请求2创建一个重复的用户。
  5. Bang。一切都停止按照你期望的方式工作。

至于是否使用唯一约束,或者有这个作为主键,则是另一个问题,并在很大程度上取决于你的情况(因为你有某种在这个表上,不要主键你是什​​么意思?)

+0

使用事务是一个很好的做法... – Migol 2010-11-16 11:53:41

+1

@Migol,我会同意,但数据库仍然是这个约束的地方,不管前端是否使用事务。 – Paddy 2010-11-16 12:20:36

+0

Erm,upvote但有一个问题,你想要使用一个唯一的约束 - 因为你真的不想使用一个“真正的”值作为主键。 – Murph 2010-11-16 12:36:19