【发布时间】:2015-07-25 20:17:52
【问题描述】:
使用 Entity Framework 7,我在一些 linq 上犯了一个简单的错误(使用了 Skip 并忘记包含我的 OrderBy 子句)。
由此引发的异常包括许多嵌套的聚合异常。
生成(并捕获)异常的代码是:
int[] newIds;
try
{
newIds = await db.Products
.Where(p => p.PortalId == portalId)
.Skip(ids.ProductIds.Count) //Skip the rows already read
.Take(takeTotal) //get the next block
.Select(p => p.ProductId)
.ToArrayAsync();
}
catch (AggregateException ex)
{
Console.WriteLine(ex.Message);
newIds = new int[] { };
}
上面的代码位于从 Asp.Net 5 WebApi 控制器调用的 repo 类中。所有级别的调用都在使用 async-await。
但是,我从中得到的聚合异常是(从上面显示的 catch 块转储到即时窗口):
System.AggregateException:发生一个或多个错误。 ---> System.AggregateException:发生一个或多个错误。 ---> System.AggregateException:发生一个或多个错误。 ---> System.AggregateException:发生一个或多个错误。 ---> System.AggregateException:发生一个或多个错误。 ---> System.AggregateException:发生一个或多个错误。 ---> System.InvalidOperationException:包含 Skip 运算符的查询 必须包含至少一个 OrderBy 操作。在 Microsoft.Data.Entity.Relational.Query.Sql.DefaultSqlQueryGenerator.GenerateLimitOffset(SelectExpression 选择表达式)在 Microsoft.Data.Entity.Relational.Query.Sql.DefaultSqlQueryGenerator.VisitSelectExpression(SelectExpression 选择表达式)在 Microsoft.Data.Entity.Relational.Query.Expressions.SelectExpression.Accept(ExpressionTreeVisitor 访客)在 Microsoft.Data.Entity.Relational.Query.Sql.DefaultSqlQueryGenerator.GenerateSql(SelectExpression selectExpression, IDictionary`2 parameterValues) 等等等等
这里的实际异常最终被一大堆聚合异常(6 个嵌套层)包裹。我明白为什么我会收到一个汇总异常,但想知道为什么会有这么多异常?更重要的是,因为我正在查看异常之前它冒泡回到控制器入口点。
这会是多层 async-await 的结果(不要认为我有多达 6 层)还是 EF7 实现中的问题?
目前使用的是 EF 7 版本 7.0.0-beta4。
【问题讨论】:
标签: c# async-await entity-framework-core aggregateexception