【问题标题】:C# LINQ - Recognize unique index violationC# LINQ - 识别唯一索引冲突
【发布时间】:2012-09-05 12:30:50
【问题描述】:

我正在使用 Linq-to-SQL 访问 SQL Server 2008。 在数据库中,我在某些列上有唯一索引。

当我在该列中输入重复数据时,LINQ 将抛出带有错误消息的 SqlException。有没有办法确定异常与 UNIQUE 索引有关,而不是与其他 SQL 错误有关?

我知道的解决方案是使用 RegEx 来解析异常消息,但我想知道有没有更优雅的方法?

【问题讨论】:

    标签: linq sql-server-2008


    【解决方案1】:

    您可以使用SQLException.Number 属性。

    有关更多详细信息,您可以迭代 Errors 集合,每个集合都有自己的 number。


    顺便说一句,过去我为SqlException 编写了自己的自定义序列化程序,但似乎在4.5 中ToString() 已被覆盖,因此现在没有必要这样做。

    【讨论】:

    • SqlException.Number 属性是解决方案,但您提供的列表不包含适当的数字。唯一密钥违规编号为 2601。有关此问题的更多信息,请访问 stackoverflow.com/questions/628189/…
    • 我必须承认,在实践中,我使我有兴趣捕获的异常发生调试异常以找到一些可区分的属性。抱歉,我实际上并没有下载该列表,我已从我的答案中删除。
    【解决方案2】:

    您可以检查具有唯一约束的表,以确定它是否已经在受约束的列中有具有某个值的行:

                if (linqDataContext.ConstrainedTable.Any(row => row.ConstrainedColumn == somevalue))
                {
                    //show a message, saying you've already got this value
                    //and it is not applicable    
                }
                else
                {
                    //accept your changes with smth like this:
                    linqDataContext.SubmitChanges();
                }   
    

    另一个问题,这种方法是否适用于您,即此查询的成本是否超过了捕获异常并处理它的成本。如果受约束的列被索引,那么对该列的简单请求一定不会那么昂贵。

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 2019-03-17
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      相关资源
      最近更新 更多