首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >实体框架:如何正确处理由于SQL约束而发生的异常

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

Stack Overflow用户
提问于 2010-09-12 17:40:15
回答 3查看 13.2K关注 0票数 17

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

例如,当两个用户试图同时向DB添加一个(几乎)相同的实体时,我得到了以下异常。

代码语言:javascript
复制
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."

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

Dirty解决方案:

代码语言:javascript
复制
    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;
        }
    }

现在,虽然这种方法有效,但它也有一些缺点:

  • No类型安全:代码依赖于异常消息,该消息包含SqlCLient类(损坏的抽象)

上唯一抽象的名称

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

注意:我不想在应用层中手动编写约束代码,我希望将它们放在数据库中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-12 18:02:03

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

在本例中,它是2627,这对于SQL Server来说是永远相同的。

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

票数 17
EN

Stack Overflow用户

发布于 2010-09-12 18:00:12

一种方法是检查内部SqlException的Errors property。SqlError类有一个标识确切错误的Number property。有关所有错误代码的列表,请参阅master.dbo.sysmessages表。

当然,这仍然将您与Sql Server捆绑在一起。除了滚动你自己的“EF异常分析器”之外,我不知道有什么方法可以把这个抽象掉。

票数 2
EN

Stack Overflow用户

发布于 2012-05-11 03:26:14

这种情况不应该发生,因为在使用EF时,不应该显式地分配键;而是允许上下文分配适当的键。如果这是一个并发问题,那么你应该在事务作用域中进行更新。

然后,如果你有一个UpdateException,你可以再次重试更新。您可以在事务作用域中安全地执行此操作,并且仅在更新彻底完成时才完成作用域。在这种情况下,下一次更新的机会比第一次更新的机会更大。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3694359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档