我一直在谷歌搜索,我发现了类似的问题,但不完全是这种情况。我有一个 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有什么问题?或者在这种情况下要遵循哪个规则?
提前致谢