由于 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/