2

我一直在谷歌搜索,我发现了类似的问题,但不完全是这种情况。我有一个 sql server 2005 存储过程,在任何数据处理调用之后,最后都会引发错误。

    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有什么问题?或者在这种情况下要遵循哪个规则?

提前致谢

4

0 回答 0