我试图在Entity Framework Core 3.0中调用过程时捕获错误,但它从未命中catch块。我尝试强制执行一些常见错误,例如错误的过程名称或错误的参数数量。
实际上,我可以逐步执行代码,而不会出错,并且可以在结果 View 中看到这些消息。
Invalid object name...
An insufficient number of arguments were supplied for the procedure or function...
我在这里想念什么?我该如何捕捉这样的错误?
try
{
IEnumerable<Users> result = (from x in _db.Users.FromSqlRaw("Execute ustp_MyProcedure)").AsEnumerable()
select x);
return result;
}
catch (Exception ex)
{
//Never gets here
}
更新
我仍然感到困惑,为什么EntityFramework Core 3.0的行为与我在较旧的MVC应用程序中使用的EF6不同。我在这里仍在使用IEnumerable,但是此设置中的错误确实会在catch块中出现。
private DatabseEntities db = new DatabseEntities();
public IEnumerable<ustp_MyProcedure_Result> MyMethod(string searchString)
{
try
{
var result= (from p in db.ustp_MyProcedure(searchString)
select p);
return sourceQuery;
}
catch (Exception ex)
{
//Even as an IEnumerable, errors DO end up in this catch block
}
}
最佳答案
您正在将查询结果分配给IEnumerable变量。 IEnumerable表示未实现的集合。枚举之前,它内部没有任何项目。仅当枚举IEnumerable时,才会执行分配给IEnumerable的数据库查询。
例如,当在foreach循环中使用它时,在其上调用ToList(),ToArray()或任何其他LINQ方法就会发生这种情况。
您只能在结果 View 中获取异常。因为检查结果 View 会具体化集合并执行数据库查询。
如果将代码更改为:
try
{
IEnumerable<Users> result = (from x in _db.Users.FromSqlRaw("Execute ustp_MyProcedure)").AsEnumerable()
select x);
return result.ToList();
}
catch (Exception ex)
{
//Never gets here
}
异常将在try块中引发。
关于c# - Entity Framework 核心3.0-捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59002856/