当前位置: 首页 > 面试题库 >

实体框架:如何正确处理由于SQL约束而发生的异常

微生景胜
2023-03-14
问题内容

我使用实体框架访问我​​的SQL数据。我在数据库模式中有一些约束,我想知道如何处理由这些约束引起的异常。

例如,当两个用户尝试同时向数据库添加(几乎)相同的实体时,出现以下异常。

System.Data.UpdateException
"An error occurred while updating the entries. See the InnerException for details."

(inner exception) System.Data.SqlClient.SqlException
"Violation of UNIQUE KEY constraint 'Unique_GiftId'. Cannot insert duplicate key in object 'dbo.Donations'.\r\nThe statement has been terminated."

如何正确捕获此特定异常?

肮脏的解决方案:

    catch (UpdateException ex)
    {
        SqlException innerException = ex.InnerException as SqlException;
        if (innerException != null && innerException.Message.StartsWith("Violation of UNIQUE KEY constraint 'Unique_GiftId'"))
        {
            // handle exception here..
        }
        else
        {
            throw;
        }
    }

现在,尽管这种方法行之有效,但它也有一些缺点:

  • 没有类型安全性:该代码取决于包含唯一列名称的异常消息。
  • 对SqlCLient类的依赖(抽象中断)

您知道更好的解决方案吗?感谢您的所有反馈。

注意: 我不想在应用程序层中手动编写约束,而是希望将它们存储在数据库中。


问题答案:

您应该能够捕获SQL错误号(即SqlException.Number)。

在这种情况下,对于SQL Server来说永远是2627。

如果要抽象,则对数据库引擎总是有一定的依赖性,因为每个引擎都会抛出不同的异常号和消息。



 类似资料:
  • 问题内容: 我需要一种使用实体框架LINQ区分SQL异常的方法,例如,当我从DbUpdateException获得的所有信息都是大量嵌套的内部异常和无用的长错误消息时,如何区分前面的关键约束违例或唯一约束违例?是否有任何较低级别的例外,我可以在其中执行“ Catch FKException”之类的操作;捕获“ uniqueException”或类似的东西。 问题答案: 正在使用sql错误代码…

  • 我无法解决这个问题。 非常感谢任何帮助。如需更多信息,请发电子邮件。

  • 考虑以下(非常简化的)实体: 在我的映射器中,我可以设置用户罚款,但是一旦执行以下代码(在数据库中保留任何更改之前)

  • 问题内容: 假设我有某种游戏。我有一个buyItem函数,如下所示: 如果我对该路由进行垃圾邮件处理,直到扣除用户余额(第二次查询),则用户余额仍为正。 我尝试过的 问题是将在第一〜5项要求。因此,这也不起作用。 我们如何处理这种情况?如果重要的话,我正在使用Sails.JS框架。 问题答案: 通过该方法,Sails 1.0现在具有完整的事务支持。例: 更新资料 正如一些评论者所指出的,启用连接池

  • 在我的应用程序中,我正在为视图的高度约束设置动画,当高度约束更改时,视图会向下平移一段时间,尽管我将约束设置为0。下面是我用来设置更改动画的代码: 下面是创建所有可扩展视图的方法: 对我来说,问题不在于如何设置高度变化的动画,因为这是可行的,而在于解决一个事实,即在一段时间内,应用程序似乎忽略了顶部的约束。这是显示动画的gif

  • 问题内容: 我遵循了MVC 3中的教程,并执行了以下操作: 制作了4个类和一个DBClass: [有一个] s的列表[有一个] s的列表[有一个] s的列表[每个标记的单词都是其自己的类]。 然后,我制作了一个这样的类: 然后,我添加了和,并导航至,然后看到了以下消息: 建立与SQL Server的连接时发生与网络相关或特定于实例的错误。 服务器未找到或无法访问。验证实例名称正确,并且已将SQL