2008-10-16 7 views
7

मेरे पास एक एएसपी.नेट साइट है जो लंबे समय से पूरी तरह से चल रही है, हाल ही में कुछ भी नहीं बदला है। एक घंटे से अगले करने के लिए मैं एक लाइन जहां मैं इस तरह एक LINQ क्वेरी कर में एक IndexOutOfRangeException मिलने लगे:क्वेरीज़ पर इंडेक्सऑटऑफेंजेंज अपवाद। सिंगल

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

ORMB.Form एसक्यूएल करने के लिए LINQ के साथ एक 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 होने का खतरा होना चाहिए this._items है [ this._size ++] = आइटम, मैं नहीं देख सकता कि मैं इसे कैसे प्रभावित कर रहा हूं।

मैं एक एपडोमेन रीसायकल करके समस्या का समाधान कर सकता हूं, इसलिए यह किसी भी तरह से कैशिंग से संबंधित होना चाहिए। मामले के मामले में, DataContext पर ऑब्जेक्टट्रैकिंग बंद है।

मेरा आंत महसूस यह है कि यह एक थ्रेडिंग समस्या हो सकती है, SqlConnectionManager को 'उपयोगकर्ता' नामक सूची फ़ील्ड में कैश किए गए IConnectionUsers के साथ। यदि दो थ्रेड एक ही समय में ऐड विधि दर्ज करते हैं, तो निम्नलिखित होने से क्या रोकता है:

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 थ्रेड सुरक्षित नहीं है।

0

जांचें कि आपके डीबीएमएल में सभी "प्राथमिक कुंजी" कॉलम वास्तव में डेटाबेस टेबल पर प्राथमिक कुंजी से संबंधित हैं। मुझे बस एक ऐसी स्थिति थी जहां डिजाइनर ने डीबीएमएल में एक अतिरिक्त पीके कॉलम डालने का फैसला किया, जिसका मतलब है कि LINQ से SQL को सहेजते समय विदेशी कुंजी के दोनों तरफ नहीं मिल सका।

संबंधित मुद्दे