entity-framework - EF Code First 在保存更改时处理数据库异常

标签 entity-framework entity-framework-4 ef-code-first

由于 EF 不支持唯一键约束,因此我们似乎需要在 Save 方法期间捕获异常,并向用户显示错误消息。

这种方法的问题是:

  • 我们怎么知道哪个记录抛出了异常
  • 我们怎么知道是什么类型的问题引发了异常(例如我可以在同一条记录上有两个唯一的约束,所以我需要告诉用户哪个被破坏了)

  • DBMS 是 SqlServer 2008。

    如何解决这些问题?

    最佳答案

    如果您允许用户可以输入在数据库中必须唯一的值,您应该在保存更改之前验证此输入:

    if (context.Customers.Any(c => c.SomeUniqueProperty == userInput))
        // return to user with a message to change the input value
    else
        context.SaveChanges();
    

    这不仅适用于数据库中具有唯一约束的值,而且适用于输入必须引用现有目标记录或主键值的外键值(如果数据库中未自动生成主键)。 EF 在后一种情况下也无济于事,因为上下文不知道整个数据库表的内容,而只知道当前附加到上下文的实体。确实,EF 将禁止附加具有相同主键的两个对象,但允许具有相同唯一键约束的两个对象。但是,当您将更改保存到数据库时,这并不能完全防止您违反主键约束。

    在不太可能的情况下,在 Any 之间检查和 SaveChanges另一个用户输入了一个具有相同值的记录,我认为发生的异常无法处理,只是告诉用户“发生了预期的错误,请再试一次......”。如果用户再次尝试 Any检查再次发生,他将从上面的代码中获得更有用的消息来更改输入值。

    此类唯一键约束或主键约束违规返回的异常是一般 DbUpdateException内部异常之一是 SqlException包含 SQL Server 错误代码作为其属性之一。任何其他详细信息只能在异常消息“违反唯一键约束 IX_SomeUniqueProperty_Index...”或类似消息中找到。如果您希望用户能够理解这些信息并做出相应的 react ,您可以显示它。否则,您可以记录此消息,以便管理员或开发人员检查可能的错误或其他问题。

    关于entity-framework - EF Code First 在保存更改时处理数据库异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269881/

    相关文章:

    c# - ASP MVC Web API + EF 中带有时区的日期时间

    asp.net-mvc-2 - 基于两个属性的自定义模型验证。一个影响另一个

    c# - LINQ-to-entities 泛型 == 解决方法

    entity-framework - 无法使用 Entity Framework 4.3.1 在实体类型上设置字段/属性

    entity-framework - 对 EF Code First 模型实体的属性有一个自定义 Setter

    data-annotations - 如何使用代码优先和数据注释在 Entity Framework 4.1 中创建一对多关系?

    entity-framework - 表属性

    asp.net-mvc-3 - 执行代码优先迁移在发布设置中显示为灰色

    c# - 删除自引用类的对象时出现 DbUpdateException

    c# - LINQ 中的嵌套选择