2012-05-10 16 views
14

The specified cast from a materialized 'System.Guid' type to the 'System.Int32' type is not valid.निर्दिष्ट डाली एक materialized 'System.Guid' प्रकार से 'System.Int32' टाइप करने के लिए वैध

हम कई WCF सेवाओं एकाधिक की संगामिति मोड और एकल के InstanceContextMode है कि नहीं है। हमारा आर्किटेक्चर कन्स्ट्रक्टर-आधारित निर्भरता इंजेक्शन का उपयोग करके एक कमजोर युग्मित मॉडल पर केंद्रित है। यह बदले में यूनिटी 2.0 का उपयोग करके लागू किया गया है (प्रत्येक सेवा के web.config में एकता कंटेनर सेक्शन में परिभाषित इंटरफेस और प्रकारों के बीच मैपिंग है)। हमारी निर्भरताओं में से एक एक डीएएल असेंबली (डेटा एक्सेस लेयर) है जो एमएसएसक्ल सर्वर के साथ संवाद करने के लिए एंटिटी फ्रेमवर्क 4 का उपयोग करती है। डेटाबेस से बात करने वाले वर्ग भी एकता मैपिंग में शामिल हैं।

जब हम अपने एकीकरण परीक्षण चलाते हैं तो सबकुछ बढ़िया होता है। लेकिन जब हम लोड परीक्षण (2, 3, 4 समवर्ती उपयोगकर्ताओं) को चलाने के लिए हम निम्न त्रुटि देखने लगते हैं हमारे प्रदर्शन पर्यावरण के लिए ले जाने के:

System.InvalidOperationException: The 'auth_token' property on 'Session' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'Guid'.

निम्नलिखित ढेर के साथ:

at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal) 
at System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName) 
at lambda_method(Closure , Shaper) 
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet) 
at lambda_method(Closure , Shaper) 
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) 
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext() 
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) 
at System.Linq.Queryable.First[TSource](IQueryable`1 source) 
at MISoa.DataAccessLayer.Authentication.AuthenticationDB.RetrieveSession(Guid authToken) 
at MISoa.DataAccessLayer.Authentication.AuthenticationAccess.RetrieveSession(String sessionToken) 

यहाँ अपराधी विधि है:

public Session RetrieveSession(Guid authToken) 
    { 
     CheckDBContext(); 
     var sessions = (from r in _dbContext.Sessions 
       where r.auth_token == authToken 
       select r); 
     return sessions.Count() > 0 ? sessions.First() : null; 
    } 

CheckDBContext विधि बस की जाँच करता है अगर db संदर्भ रिक्त है और, अगर यह है, यह एक कस्टम अपवाद फेंकता tion।

Guid auth_token 
DateTime time_stamp 
String user_id 
String app_id 

तो, यह कभी कभी ऊपर LINQ डेटाबेस जहां पहले कॉलम एक int और नहीं एक guid है से किसी अन्य वस्तु रिटर्न की तरह दिखता है:

emdx सत्र इकाई वस्तु इन सार्वजनिक गुण है? और यदि हां - क्यों? क्या मुझे एक-दूसरे के डीबी संदर्भ को ओवरराइड करने वाले एकाधिक धागे के साथ कोई समस्या है? बीटीडब्ल्यू - हमने उस कोड को सारणीबद्ध किया जो डीबी संदर्भ को एक अलग वर्ग (बेसडीबी) में तत्काल करता है जिसे एकता द्वारा भी संभाला जाता है। इसलिए, क्योंकि सेवा एक सिंगलटन है क्योंकि मेरे पास बेसडीबी का एक उदाहरण है, है ना? क्या यह समस्या यहाँ है?

ओह, एक और बात। हमें बताया गया था कि हमारे पास एमएसएसएलएल 2005 होगा ताकि एडीएमएक्स फाइल में हमारे पास ProviderManifestToken="2005" हो। लेकिन मैंने अभी जांच की है और हमारे प्रदर्शन डेटाबेस के साथ सर्वर संस्करण 2008 है। क्या यह एक समस्या है?

आपकी मदद के लिए धन्यवाद।

+0

पहली सरल चीजें जो मैं जांचूंगा: क्या आपके डीबी में एक गुड है? त्रुटि कहती है कि कुछ int.auth_token को int में सेट करने का प्रयास कर रहा है। क्या कोई int आईडी कॉलम है जिसे ठीक से मैप नहीं किया गया है?क्या आप एक एसक्यूएल प्रोफाइलिंग ट्रेस कर सकते हैं और वास्तविक एसक्यूएल कॉल की पहचान कर सकते हैं? मुझे सच में संदेह है कि बहु-थ्रेडिंग आपकी समस्याओं का कारण बन रही है। –

+0

क्या आप सुनिश्चित हैं कि डेटाबेस में कॉलम संबंधित संपत्ति प्रकार का है? अपवाद कहता है कि डीबीडेटा रीडर ग्रिड पढ़ता है लेकिन आपकी कक्षा की संपत्ति int है। – Pawel

उत्तर

2

Do I have a problem with multiple threads overriding each other's db context?

हां। ऊपर के लिंक में बड़े पीले बॉक्स से http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx

उद्धरण:: यहाँ देखें

The ObjectContext class is not thread safe. The integrity of data objects in an ObjectContext cannot be ensured in multithreaded scenarios.

आप अपने _dbContext मैदान पर [ThreadStaticAttribute] डालने पर विचार कर सकते।

+1

तो मुख्य समस्या यह है कि ऑब्जेक्ट कॉन्टेक्स्ट थ्रेडसेफ नहीं है - ठीक है, लेकिन मैं बस उल्लेख करना चाहता था कि डीबीकॉन्टेक्स्ट प्रॉपर्टी बनाना थ्रेडस्टैटिक डब्ल्यूसीएफ/एएसपी.नेट में उपयोग किए जाने पर और अधिक समस्याएं पैदा कर सकता है, होस्ट के आधार पर और कैसे (या बेहतर) आप संपत्ति शुरू करते हैं। उदाहरण के लिए, डब्ल्यूसीएफ का उपयोग करते समय आपको इन चीजों को स्टोर करने के लिए ऑपरेशन कॉन्टेक्स्ट का उपयोग करना चाहिए, चूंकि अनुरोध स्वीकार करने वाला थ्रेड ऐसा निष्पादित नहीं हो सकता है जो इसे निष्पादित कर रहा है। [ऑपरेशन कॉन्टेक्स्ट] देखें (http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontext.aspx)। –

+0

@ बर्नार्ड किरचर: बिल्कुल सही - अच्छा बिंदु! – RobSiklos

0

मुझे संदेह है कि कोई समस्या नहीं होने पर आपकी समस्या उत्पन्न होती है, और उत्पन्न शून्य में GUID फ़ील्ड तुलना के लिए शून्य मूल्य == 0 का उपयोग किया जाता है। एक स्ट्रिंग (टॉस्ट्रिंग() दोनों पर तुलना करने की कोशिश करें) और देखें कि क्या आप अपनी समस्या का कारण बनने वाले मामले को पकड़ सकते हैं।