由于 EF 不支持唯一键约束,看来我们需要在 Save 方法期间捕获异常,并向用户显示错误消息。
这种方法的问题是:
- 我们如何知道哪条记录引发了异常
- 我们怎么知道什么样的问题引发了异常(例如,我可以在同一记录上有两个唯一的约束,所以我需要告诉用户哪个被破坏了)
DBMS 是 SqlServer 2008。
如何解决这些问题?
由于 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 错误代码作为其属性之一。任何其他详细信息只能在异常消息“违反 UNIQUE KEY 约束 IX_SomeUniqueProperty_Index... ”或类似消息中找到。如果您希望用户能够理解并对此信息做出相应的反应,您可以显示它。否则,您可以记录此消息以供管理员或开发人员检查可能存在的错误或其他问题。