Queryable.Single上的IndexOutOfRangeException

我有一个ASP.NET网站已经运行了很长时间,最近没有任何改变。 从一个小时到下一个小时,我开始在一行中接收一个IndexOutOfRangeException,我在这里执行LINQ查询:

var form = SqlDB.GetTable() .Where(f => f.FormID == formID) .Single(); 

ORMB.Form是一个POCO对象,LINQ to SQL属性将其映射到MSSQL表(映射validation为正确)。 堆栈跟踪如下:

 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的唯一一行是this._items [this._size ++] = item,但我看不出我是如何影响它的。

我可以通过做一个appdomain回收来解决这个问题,所以它必须以某种方式缓存相关。 如果重要,则在DataContext上关闭ObjectTracking。

我的直觉是,这可能是一个线程问题,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在保存时无法找到外键的两面。