0

所以我在捕捉向数据库添加新记录的异常时遇到了问题。

我正在使用实体框架

在此处输入图像描述

这是我的代码:

public void AddNewStandardEngineeredModel(StandardEngineeredModel model)
    {
        using (context = new LabelPrintingContext())
        {

            try
            {
                context.EngineeredModels.Add(model);
                context.SaveChanges();
            }
            catch (SqlException ex)
            {
                if (ex.Number == 2601)
                {
                    //Violation of primary key. Handle Exception
                }
                else throw;
            }
        }
    }

我还尝试了以下方法:

 public void AddNewStandardEngineeredModel(StandardEngineeredModel model)
    {
        using (context = new LabelPrintingContext())
        {

            try
            {
                context.EngineeredModels.Add(model);
                context.SaveChanges();
            }
            catch (UpdateException ex)
            {
                var sqlException = ex.InnerException as SqlException;

                if (sqlException != null && sqlException.Errors.OfType<SqlError>()
                    .Any(se => se.Number == 2601))
                {

                    // it's a dupe... do something about it
                }
                else
                {
                    // it's something else...
                    throw;
                }
            }
        }
    }

如果我只是执行 catch(Exception Ex) 它将捕获异常,但我想检查该数字以更好地响应我的用户。这样,如果要添加副本,我可以让他们知道并适当地修复它。

这是错误的图片:

在此处输入图像描述

不太确定还有什么可以尝试捕获特定异常。任何建议都会有所帮助。

4

1 回答 1

1

使用 ORM 时,SqlException 通常会被包装,有时会嵌套很多。因此,您需要一个辅助函数来遍历异常树并找到 SqlException(如果存在):

    static SqlException GetSqlException(Exception exception)
    {
        if (exception is SqlException sqlException) return sqlException;
        return exception.InnerException == null ? null : GetSqlException(exception.InnerException);
    }

然后,您可以使用任何您喜欢的策略来捕获异常细粒度的异常,并在发现异常时处理 SqlException。例如基于您的代码:

public void AddNewStandardEngineeredModel(StandardEngineeredModel model)
{
    using (context = new LabelPrintingContext())
    {

        try
        {
            context.EngineeredModels.Add(model);
            context.SaveChanges();
        }
        catch (Exception ex)
        {
            var sqlException = GetSqlException(ex);

            if (sqlException != null && sqlException.Errors.OfType<SqlError>()
                .Any(se => se.Number == 2601))
            {

                // it's a dupe... do something about it
            }
            else
            {
                // it's something else...
                throw;
            }
        }
    }
}
于 2018-07-10T23:49:16.630 回答