C# SQL唯一密钥插入

C# SQL唯一密钥插入,c#,.net,entity-framework,exception-handling,sql-server-2008-r2,C#,.net,Entity Framework,Exception Handling,Sql Server 2008 R2,我有一个Users表,它对用户名有唯一的约束(出于明显的原因) 我正在使用EF 4.0 DAL填充数据库,并正在编写CreateUser()方法 是不是 如果我试图插入一个已经存在的用户名,最好捕获抛出的SqlException 在尝试将用户名插入数据库之前,是否显式检查用户名 如果你也能给出原因,那就太好了 我会先检查记录是否存在。独特的键约束有助于防止应用程序允许“坏”数据首先通过的可能方式,而不是主要的阻止方式。在可能避免的情况下,使用异常作为控制流机制(在本例中为验证)通常是一个坏主意

我有一个Users表,它对用户名有唯一的约束(出于明显的原因)

我正在使用EF 4.0 DAL填充数据库,并正在编写CreateUser()方法

是不是

  • 如果我试图插入一个已经存在的用户名,最好捕获抛出的SqlException
  • 在尝试将用户名插入数据库之前,是否显式检查用户名

  • 如果你也能给出原因,那就太好了

    我会先检查记录是否存在。独特的键约束有助于防止应用程序允许“坏”数据首先通过的可能方式,而不是主要的阻止方式。在可能避免的情况下,使用异常作为控制流机制(在本例中为验证)通常是一个坏主意


    编辑:为了避免混淆,我不是说没有唯一索引。它应该存在,但不应该是检查唯一性的主要手段。

    我认为最好处理异常。数据库是为了处理用户名的唯一性而设计的,因此我认为它可以比您更有效地处理用户名。此外,它还增加了系统的可移植性和内聚性。如果在多个位置添加用户,则必须重复用户名检查或创建一个方法,基本上,最终将重写数据库引擎已经编写的内容。

    我支持samuel的说法。最有效的方法是将其留给数据库。所有其他选项都会耗费更多的时间和资源……

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


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

    好的方面:重写功能,然而,DAL缓解了这一问题,这意味着所有用户操作都要通过DAL。设计良好的体系结构不需要重复检查。只需将逻辑放在它自己的类中,并在需要时使用该类。就是这样,或者,每次都捕捉异常。理想情况下,应用程序中只有一个CreateUser。正确-DAL中的一个CreateUser由需要它的Web服务使用。谢谢。关于为什么将异常用作控制流机制是一个坏主意,您是否有任何链接?当然,我将向您介绍另一个SO讨论:我特别喜欢“异常用于异常情况,而不是正常流”这句话。在许多情况下,捕获异常从来没有其意图那么清楚。如果异常是由于不同的原因引发的呢?您每次都要检查异常和消息吗?如果Microsoft在更高版本的SQL中更改了异常消息,该怎么办?还有一个很好的讨论:是的,但当用户尝试在唯一索引上插入重复项时,我使用过的每个数据库都会引发异常。因此,基本上,您是在经历困难,以避免数据库制造商(很可能是经过深思熟虑的)的愿望。