[英]MVC 2 Unique index validation
有没有一种方法可以验证模型上唯一的属性? 例如,用户可以创建和编辑“产品”,但他们不能使用现有的ProductCode创建产品,也不能编辑产品并将ProductCode更改为已存在的代码。
我尝试使用自定义属性。
public class Unique : ValidationAttribute
{
public override bool IsValid(object value)
{
var products = Repository.Store.Products.Where(x => x.ProductCode == value);
return (products.Count() == 0);
}
}
我可以用此解决方案介绍的所有内容是,当数据库中已经存在代码时,不允许用户插入/更新产品。 这不允许用户编辑现有产品,因为当他们提交时,它将看到代码已经存在(它将是他们尝试编辑的产品的代码。)并返回false。
在MVC 2中没有办法处理唯一索引,我已经搜索了数小时,甚至发现了关于stackoverflow的其他主题,但是没有一个可靠的解决方案。
只需让插入或更新失败,然后向用户返回适当的错误消息即可。 无论如何,预先检查还是有问题的,因为总是有另一个用户在检查后立即修改数据库的可能性。
这是一个示例,说明如何插入对象并确定它是否由于唯一约束而失败:
INSERT INTO MyTable (column1, column2, column3)
SELECT @param1, @param2, @param3
WHERE NOT EXISTS (SELECT * FROM table WHERE id = @param4)
如果对象已经存在,这将修改0行。 如果没有,它将修改1行。 如果有其他问题,您将获得一个例外。 这也是非常有效的(至少在SQL Server中)。 正如您所希望的那样,它导致索引查找,然后进行索引更新。
在相关领域,我与MVC有点挣扎。
我的问题的部分答案是,您应该“大概”拥有一个单独的对象插入和更新模型。
这样,您可以仅在插入模型上具有自定义属性。
否则,只需在插入方法(而不是自定义属性)中将其作为常规代码检查来解决即可。
好的我明白了....
您可以对对象上某个唯一ID的存在进行“不等于”检查吗-这样您就可以检查当前产品上是否存在产品代码BUT。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.