Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC2唯一索引验证_C#_Asp.net Mvc 2_Unique Index - Fatal编程技术网

C# MVC2唯一索引验证

C# MVC2唯一索引验证,c#,asp.net-mvc-2,unique-index,C#,Asp.net Mvc 2,Unique Index,是否有方法验证模型上应该唯一的属性?例如,用户可以创建和编辑“产品”,但他们不应该使用现有产品代码创建产品,也不应该编辑产品并将产品代码更改为已存在的代码 我已尝试使用自定义属性 public class Unique : ValidationAttribute { public override bool IsValid(object value) { var products = Repository.Store.Products.Where(x =>

是否有方法验证模型上应该唯一的属性?例如,用户可以创建和编辑“产品”,但他们不应该使用现有产品代码创建产品,也不应该编辑产品并将产品代码更改为已存在的代码

我已尝试使用自定义属性

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


在MVC2中是否没有处理唯一索引的方法,我已经搜索了几个小时,甚至在stackoverflow上找到了其他主题,但没有找到一个解决方案

我在相关领域与MVC有点冲突

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

这样,您就可以在插入模型上拥有自定义属性


否则,只需在插入方法中进行常规代码检查,而不是在自定义属性中进行检查。

只需让插入或更新失败,然后向用户返回相应的错误消息。不管怎样,预先检查是有问题的,因为在您进行检查之后,总是有可能会有其他用户立即修改数据库

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

INSERT INTO MyTable (column1, column2, column3) 
    SELECT @param1, @param2, @param3
    WHERE NOT EXISTS (SELECT * FROM table WHERE id = @param4)
如果对象已存在,则将修改0行。如果没有,则将修改1行。如果还有什么问题,你会得到一个例外。这也是非常有效的(至少在SQLServer中是如此)。正如您所希望的那样,它会在索引查找之后进行索引更新。

好的,我明白了


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

也许我误解了您的问题,但产品代码是主键吗?如果没有,原因是什么?我认为这是一个解决方案,但问题是没有“适当”的方法来确定更新是否由于唯一索引或其他原因而失败。我能看到的唯一方法是首先确保异常和内部异常都匹配预期的类型,然后对内部异常消息进行字符串匹配以确保。但这可能会导致今后的问题。我不太担心同时进行多个更新。它可以抛出异常,然后他们可以重试。。。这种情况不太可能发生,因为没有太多的用户或更新我会支持这种方法。让DB做一些工作。我确信SQL将抛出独特的异常代码,用于唯一密钥冲突。使用此代码,然后通知用户。在.NET中捕获SQL异常是有问题的,但这不是确定插入是否由于唯一约束而失败的唯一方法。我将用一个例子来说明我的答案。谢谢你的回答,我已经用类似的方法实现了它。(使用linq而不是查询)我也考虑了两个独立的模型,但在使用属性时仍然无法检查产品代码是否已更改。