Entity Framework database first不会捕获存储过程末尾的sql错误
我一直在谷歌搜索,我发现了类似的问题,但不完全是这个案例。 我有一个SQLServer2005存储过程,它在任何数据处理调用结束时都会引发错误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)
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以强调该问题