IndexOutOfRangeException on Queryable.Single
本文关键字:Single Queryable on IndexOutOfRangeException | 更新日期: 2023-09-27 17:47:47
我有一个ASP.NET网站已经完美运行了很长一段时间,最近没有任何变化。从一个小时到下一个小时,我开始在执行LINQ查询的一行中收到IndexOutOfRangeException,如下所示:
var form = SqlDB.GetTable<ORMB.Form, CDB>()
.Where(f => f.FormID == formID)
.Single();
Form是一个具有LINQ到SQL属性的POCO对象,将其映射到MSSQL表(映射被验证为正确)。堆叠通道如下:
System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.IndexOutOfRangeException: Index was outside the bounds of the array.
at System.Collections.Generic.List`1.Add(T item)
at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
at System.Linq.Queryable.Single[TSource](IQueryable`1 source)
at GetForm.Page_Load(Object sender, EventArgs e)
反射System.Collections.Generic.List.Add显示以下代码:
public void Add(T item)
{
if (this._size == this._items.Length)
{
this.EnsureCapacity(this._size + 1);
}
this._items[this._size++] = item;
this._version++;
}
唯一容易出现IndexOfOutRangeException的行是这样的_items[this.size++]=item,但是我看不出我是如何影响它的。
我可以通过进行appdomain回收来解决这个问题,所以它一定与缓存有关。ObjectTracking在DataContext上处于关闭状态,以备不时之需。
我的直觉是,这可能是一个线程问题,SqlConnectionManager在名为"users"的List字段中缓存了IConnectionUsers。如果两个线程同时进入Add方法,是什么阻止了以下情况的发生:
T1: Add(x)
T2: Add(y)
T1: Since _size == _items.Length: EnsureCapacity(_size + 1)
T2: Since _size > _items.Length: _items[_size++] = item;
T1: _items[size++] = item <- OutOfRangeException since T2 didn't increase the capacity as needed
有人吗?
您是否共享一个通用的DataContext?这将解释您所描述的线程问题,因为DataContext不是线程安全的。
检查dbml中的所有"主键"列是否实际与数据库表上的主键相关。我刚刚遇到一种情况,设计者决定在dbml中添加一个额外的PK列,这意味着LINQ to SQL在保存时无法找到外键的两侧。