由于EF不支持唯一键约束,似乎我们需要在Save方法中捕获异常,并向用户显示错误消息。
这种方法的问题是:
DBMS是SqlServer 2008。
如何解决这些问题?
答案 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 ... ”或类似内容中找到任何其他详细信息。如果您希望用户能够理解并对此信息作出相应的反应,您可以显示它。否则,您可以为管理员或开发人员记录此消息,以检查是否存在可能的错误或其他问题。