C# 如何使用验证来强制ASP.NET MVC 2中属性的唯一性?

C# 如何使用验证来强制ASP.NET MVC 2中属性的唯一性?,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,假设一个对象的字段在数据库中不能有重复的值。我的第一反应是创建一个唯一的属性,可以将其作为数据注释应用于属性。此唯一属性将命中数据库并检查该值是否已存在。这在执行create方法时会起作用,但在更新时会失败。在更新时,我会为实体的每个唯一字段(其值我不想更改)得到一个重复值错误。在ASP.NET MVC 2上以一种非常适合ModelState的方式实现这一点的好方法或既定实践是什么?将对象的id传递给属性验证器可以通过检查找到的重复值是否与我正在更新的实体相同来工作,但我不知道如何从验证器内部获

假设一个对象的字段在数据库中不能有重复的值。我的第一反应是创建一个唯一的属性,可以将其作为数据注释应用于属性。此唯一属性将命中数据库并检查该值是否已存在。这在执行create方法时会起作用,但在更新时会失败。在更新时,我会为实体的每个唯一字段(其值我不想更改)得到一个重复值错误。在ASP.NET MVC 2上以一种非常适合ModelState的方式实现这一点的好方法或既定实践是什么?将对象的id传递给属性验证器可以通过检查找到的重复值是否与我正在更新的实体相同来工作,但我不知道如何从验证器内部获取该数据


如果这是一个愚蠢的问题,或者措辞不连贯,请原谅我。现在已经快凌晨3点了,我从昨天早上就开始编码了。

对于这种验证,我会让数据库做它已经做得很好的事情。确保您的数据库具有唯一约束,并在您违反该约束时让它报告错误。然后,您可以将错误添加到模型错误中(使用友好的文本,而不仅仅是链接SQL错误)

如果您决定自己执行检查,您可以通过排除当前记录来绕过更新问题

SELECT COUNT(*)
FROM myTable
WHERE myTable.UniqueValue = 'ShouldBeUnique'
AND myTable.Id <> 5
选择计数(*)
从myTable
其中myTable.UniqueValue='shouldbeeunique'
和myTable.ID5

在本例中,您使用正在更新的记录的id来避免检查它,这意味着您只需检查其他记录以查看它们是否包含唯一值。

让数据库进行验证将是最佳决策。使用我的应用程序中的附加查询进行验证可能会给我一个状态的图片,该状态可能在稍后执行实际数据插入或更新时发生了更改。我的数据库已经有了相应的约束,但我没有使用异常将错误消息冒泡到我的视图中。我试图将关注点分开,但我想我必须做一些事情,比如将ModelState从控制器传递给服务,将错误从repo传递给服务。我想要更干净的。