【问题标题】:Entity Framework Core 3.0 - Catch ErrorsEntity Framework Core 3.0 - 捕获错误
【发布时间】:2020-03-19 00:49:33
【问题描述】:

我试图在 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
        }
    }

【问题讨论】:

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


    【解决方案1】:

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

    例如,当您在 foreach 循环中使用它时,会发生这种情况,在其上调用 ToList()、ToArray() 或任何其他 LINQ 方法。

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

    如果您将代码更改为:

    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 块中引发。

    【讨论】:

    • 让我问一下,将我的所有过程调用作为列表返回是不好的做法还是性能不好?我正在寻找一种推荐的方法来处理这样的数据。我只是不喜欢使用 IEnumerable 时出现未知错误的想法。
    • 一个未实现的 IEnumerable 迟早必须在某个时间点实现。因此,执行一次物化将不是问题。一些错误可能会导致性能不佳。就像使用结果 IEnumerable 来执行多个查询一样。每次调用 result.Count()、result.Any() 或 result.ToList() 时,都是发送到数据库的单独查询。在物化集合上执行的每个 LINQ 方法都在内存中执行。您可以在此处查看使用 FromSqlRaw 的示例:docs.microsoft.com/en-us/ef/core/querying/raw-sql 每个调用的末尾都有一个 .ToList。
    • 如果您不确定,何时以及生成什么 SQL 查询启用 EF 控制台日志记录。这里有一些例子:docs.microsoft.com/en-us/ef/ef6/fundamentals/…可能与核心略有不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2023-03-07
    • 2020-05-23
    • 2019-11-13
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多