Entity Framework database first不会捕获存储过程末尾的sql错误

Entity Framework database first不会捕获存储过程末尾的sql错误,sql,entity-framework,exception-handling,Sql,Entity Framework,Exception Handling,我一直在谷歌搜索,我发现了类似的问题,但不完全是这个案例。 我有一个SQLServer2005存储过程,它在任何数据处理调用结束时都会引发错误 Create Procedure webzTest( @nClaPais Int ) As Begin Select * From zPais Where ClaPais = @nClaPais Raiserror('TEST ERROR!!!', 16, -1)

我一直在谷歌搜索,我发现了类似的问题,但不完全是这个案例。 我有一个SQLServer2005存储过程,它在任何数据处理调用结束时都会引发错误

    Create Procedure webzTest(
      @nClaPais Int
    )
    As
    Begin 

        Select * From zPais Where ClaPais = @nClaPais
        Raiserror('TEST ERROR!!!', 16, -1)  
    End
在客户端实体框架上,Visual Studio 2012尝试捕获异常,但忽略了它

    public static void webzTestTransaction()
    {
        using (var ctx = new MyWebEntities())
        {
            using (var trx = MyTransactionScope.newTransactionScope())
            {
                var connection = ((IObjectContextAdapter)ctx).ObjectContext.Connection;
                connection.Open();  // Open connection explicitly to avoid EF closing and reopening which invokes DTC
                try
                {
                    ctx.webzTest(1).ToList();
                    ctx.webzTest(2).ToList();
                    trx.Complete();
                }
                catch (Exception ex)
                {
                    logger.Error(ex);
                    throw ex;
                }
                finally
                {
                    connection.Close();
                }
            }
        }
    }
引发的错误将被忽略。 如果我将Raiserror语句放在Select之前,那么EF代码会捕获异常,但我希望上述代码中会出现相同的行为

让我使用ADO.NET添加一个类似的示例。在这种情况下,按照预期捕获异常:

        SqlConnection conn = new SqlConnection(connectionString);
        conn.Open();

        SqlTransaction trx = null;
        try
        {
            trx = conn.BeginTransaction(IsolationLevel.ReadUncommitted);

            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Connection = conn;
            cmd.CommandText = "webzTest";
            cmd.Transaction = trx;

            var parClaPais = new SqlParameter("@nClaPais", SqlDbType.Int);
            cmd.Parameters.Add(parClaPais);

            parClaPais.Value = 1;
            SqlDataReader result1 = cmd.ExecuteReader();

            parClaPais.Value = 2;
            SqlDataReader result2 = cmd.ExecuteReader();
            trx.Commit();
            trx = null;
        }
        catch (Exception ex)
        {
            if (trx != null)
                trx.Rollback();

            throw ex;
        }
        finally
        {
            conn.Close();
        }
那么:EF有什么问题?或者在这种情况下应该遵循哪条规则


提前感谢

查看此线程Pawel,感谢您的回复。在该线程中,问题是Raiserror严重性级别为10。本例严重程度为16。它应该会将错误返回到C代码。实际上,它正确地引发了错误,因为ADO.NET代码缓存了该错误。但是为什么EF代码忽略了它?在您的第一个示例中没有捕获,这是有意的吗?谢谢您的回答。我是故意的。在代码层次结构的更高层捕获异常。我将catch块添加到webzTestTransaction以强调该问题