【发布时间】: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' 类型不是 有效。
****注意:数据库表的列和数据模型的属性具有相同的类型。而且这个错误与强制转换无关。**
【问题讨论】:
-
您是否在多个线程之间共享数据库上下文实例?
-
@IvanStoev 不,我为每个服务调用创建数据库上下文。当工作量增加时,所有用户都会接受这些例外。我在考虑数据库上下文的并发性,但我找不到任何东西。我不知道这些错误的主要原因
-
如何将 DbContext 范围限定为请求?通过 IoC 容器?要测试跨 DbContext 实例的并发问题,请使用方法和 DbContext.GetHashCode() 值输出跟踪。除此之外,您可能需要发布有关如何在这些失败的调用上使用 DbContext、返回的内容以及调用堆栈信息或这些操作正在崩溃的行的附加代码。对于负载下的类 API 调用,理想情况下,您应该考虑异步操作 /w await 以释放工作线程以有效处理负载。
-
@CiubotariuFlorin 没有。错误发生的频率低于过去。但我认为这可能是由于数据库服务器上的负载较少。
标签: c# sql-server entity-framework wcf iis