Entity Framework 抛出意外异常,工作量大

Posted

技术标签:

【中文标题】Entity Framework 抛出意外异常,工作量大【英文标题】:Entity Framework throws unexpected exceptions with a heavy workload 【发布时间】:2018-05-28 06:21:54 【问题描述】:

我们有一个在 IIS 上使用 MSSQL2016、EntityFramework 和 WCF 服务的运营项目。在正常情况下,一切都很好,但是当工作量增加时,EntityFramework 会在 linq 查询上引发异常:

... ToList -> .ctor -> MoveNext -> TryReadToNextElement -> MoveNext -> MaterializeRow -> HasNextElement -> lambda_method-> IsDBNull -> CheckHeaderIsReady

System.IndexOutOfRangeException:索引超出范围 数组。

-

... FirstOrDefault -> MoveNext -> TryReadToNextElement -> MoveNext -> MaterializeRow -> HasNextElement -> lambda_method -> GetGuid -> 获取_SqlGuid

System.InvalidCastException:指定的强制转换无效。

-

... FirstOrDefault -> MoveNext -> ReadNextElement -> lambda_method -> 获取值

System.InvalidOperationException:从 将 'System.Int32' 类型具体化为 'System.Guid' 类型不是 有效。

****注意:数据库表的列和数据模型的属性具有相同的类型。而且这个错误与强制转换无关。**

【问题讨论】:

"The specified cast from a materialized 'System.Guid' type to the 'System.Int32' type is not valid."的可能重复 您是否在多个线程之间共享数据库上下文实例? @IvanStoev 不,我为每个服务调用创建数据库上下文。当工作量增加时,所有用户都会接受这些例外。我在考虑数据库上下文的并发性,但我找不到任何东西。我不知道这些错误的主要原因 如何将 DbContext 范围限定为请求?通过 IoC 容器?要测试跨 DbContext 实例的并发问题,请使用方法和 DbContext.GetHashCode() 值输出跟踪。除此之外,您可能需要发布有关如何在这些失败的调用上使用 DbContext、返回的内容以及调用堆栈信息或这些操作正在崩溃的行的附加代码。对于负载下的类 API 调用,理想情况下,您应该考虑异步操作 /w await 以释放工作线程以有效处理负载。 @CiubotariuFlorin 没有。错误发生的频率低于过去。但我认为这可能是由于数据库服务器上的负载较少。 【参考方案1】:

问题可能出在您处理工作量的方式上吗?因为您正在尝试访问列表中不存在或尚不存在(延迟)的索引。我在这里找到了一些文章WCF - IndexOutOfRange exception when instantiating ChannelFactory

【讨论】:

以上是关于Entity Framework 抛出意外异常,工作量大的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework——常见报错总结

Buildserver 找不到 Entity Framework Sql Provider

ado.net entity framework无法更新数据库

Entity Framework优化一:引发了“System.Data.Entity.Core.EntityCommandExecutionException”类型的异常

Entity Framework 4.2 模型生成异常

EJB - 重新抛出未决异常时发现意外异常