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

时间:2012-06-29 22:47:40

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

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

这种方法的问题是:

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

DBMS是SqlServer 2008。

如何解决这些问题?

1 个答案:

答案 0 :(得分:2)

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

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错误代码作为其属性之一。只能在异常消息“违反UNIQUE KEY约束IX_SomeUniqueProperty_Index ... ”或类似内容中找到任何其他详细信息。如果您希望用户能够理解并对此信息作出相应的反应,您可以显示它。否则,您可以为管理员或开发人员记录此消息,以检查是否存在可能的错误或其他问题。