实体框架核心3.0-捕获错误

时间:2019-11-22 22:59:05

标签: c# asp.net-core error-handling entity-framework-core

我正在尝试在Entity Framework Core 3.0中调用过程时捕获错误,但是它从未命中catch块。我尝试强制执行一些常见错误,例如错误的过程名称或错误的参数数量。

我实际上可以逐步浏览代码,而不会出错,并且可以在结果视图中看到这些消息。
 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
        }
    }

1 个答案:

答案 0 :(得分:2)

您正在将查询结果分配给IEnumerable变量。 IEnumerable表示未实现的集合。枚举之前,它内部没有任何项目。仅当枚举IEnumerable时,才会执行分配给IEnumerable的数据库查询。

例如,当您在foreach循环中使用它时,在其上调用ToList(),ToArray()或任何其他LINQ方法。

您只能在结果视图中获取异常。因为检查结果视图会具体化集合并执行数据库查询。

如果您将代码更改为:

{{1}}

try块中将引发异常。