【问题标题】:SQL Unique key insertionsSQL 唯一键插入
【发布时间】:2010-11-05 03:01:55
【问题描述】:

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

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

是不是……

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

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

【问题讨论】:

    标签: c# .net entity-framework exception-handling sql-server-2008-r2


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 vcsjones。您是否有任何链接说明为什么使用异常作为控制流机制是一个坏主意?
    • 当然,我会向您推荐另一个 SO 讨论:stackoverflow.com/questions/1336094/… 我特别喜欢这句话“例外是针对例外情况,而不是针对正常流程”在许多情况下,捕获异常永远不会像清楚的意图是什么。如果由于其他原因引发异常怎么办?你会每次都检查异常和消息吗?如果 Microsoft 在更高版本的 SQL 中更改异常消息怎么办?
    • 关于它的另一个很好的讨论:stackoverflow.com/questions/729379/…
    • 是的,但是当用户尝试在唯一索引上插入重复项时,我曾经使用过的每个数据库都会引发异常。因此,基本上,您正在努力避免数据库制造商的(很可能是经过深思熟虑的)愿望。
    【解决方案2】:

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

    【讨论】:

    • 好点 re:重写功能,但是这被 DAL 缓解了,这意味着所有用户操作都经过这个。
    • 一个设计良好的架构不需要重复检查。只需将逻辑放在它自己的类中,并在需要时使用该类。就是这样,或者,每次都捕获异常。理想情况下,应用程序中只有一个 CreateUser。
    • 正确 - DAL 中的一个 CreateUser 供需要它的 Web 服务使用。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多