1

有没有办法验证模型上应该是唯一的属性?例如,用户可以创建和编辑“产品”,但他们不应该能够创建具有现有 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 上找到了其他主题,但没有一个可靠的解决方案。

4

3 回答 3

3

只需让插入或更新失败,然后向用户返回适当的错误消息。无论如何,预先检查都是有问题的,因为其他用户总是有可能在您检查后立即修改数据库。

下面是一个示例,说明如何插入对象并确定它是否由于唯一约束而失败:

INSERT INTO MyTable (column1, column2, column3) 
    SELECT @param1, @param2, @param3
    WHERE NOT EXISTS (SELECT * FROM table WHERE id = @param4)

如果对象已经存在,这将修改 0 行。如果没有,那么它将修改 1 行。如果出现其他任何问题,您将获得异常。这也非常有效(至少在 SQL Server 中)。正如您希望的那样,它会导致索引搜索,然后是索引更新。

于 2010-12-15T13:41:59.957 回答
0

我在相关领域与 MVC 有点挣扎。

我的问题的部分答案是你应该“可能”有一个单独的模型来插入和更新一个对象。

这样你就可以在插入模型上拥有你的自定义属性。

否则,只需将其作为插入方法中的常规代码检查来处理,而不是在自定义属性中。

于 2010-12-15T13:34:52.233 回答
0

好的我明白了....

您能否对对象上某些唯一 ID 的存在进行“不等于”检查 - 这样您可以检查产品代码的存在,但不在当前产品上。

于 2010-12-15T13:57:49.587 回答