2008-10-16 2 views
7

오랫동안 완벽하게 실행 된 ASP.NET 사이트가 있습니다. 최근에 변경된 사항이 없습니다. 한 시간에서 다음에 나는이 같은 LINQ 쿼리 할 라인에 IndexOutOfRangeException을 받기 시작 :Queryable.Single의 IndexOutOfRangeException

var form = SqlDB.GetTable<ORMB.Form, CDB>() 
    .Where(f => f.FormID == formID) 
    .Single(); 

ORMB.Form는 SQL에 LINQ와 POCO 개체입니다 (AN MSSQL 테이블에 매핑 매핑을 속성 올바른 것으로 확인 됨). 스택 트레이스는 다음과 같다 : System.Collections.Generic.List.Add 반영

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) 

다음 코드 보여준다

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 recycle을 수행하여 문제를 해결할 수 있으므로 어떻게 든 관련 캐싱을해야합니다. 중요한 경우 DataContext에서 ObjectTracking이 해제됩니다.

내 생각에 이것은 스레딩 문제 일 수 있으며 List 필드에 'users'라는 이름의 IConnectionUsers가 캐시 된 SqlConnectionManager입니다. 두 스레드가 동시에 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 

사람이 누구입니까?

답변

3

공통 DataContext를 공유하고 있습니까? DataContext는 스레드로부터 안전하지 않으므로 설명하는 스레드 문제를 설명합니다.

0

dbml의 모든 "기본 키"열이 실제로 데이터베이스 테이블의 기본 키와 관련되어 있는지 확인하십시오. 방금 디자이너가 여분의 PK 열을 dbml에 넣기로 결정한 상황에서 LINQ to SQL은 저장할 때 외래 키의 양쪽을 찾을 수 없습니다.

관련 문제