2012-03-17 17 views
6

पर इकाई फ्रेमवर्क nvarchar केस संवेदनशीलता नीचे मेरे पास काफी सरल तालिका संरचना है और मुझे अजीब लगता है। हालांकि मैंने इसके आसपास काम करना चुना है लेकिन विशेषज्ञों की राय लेना चाहते हैं।विदेशी फ्रेम

मैं दो टेबल्स

Users 
UserName nvarchar(250) Primary Key 
FirstName nvarchar(50) 
LastName nvarchar(50) 

Registrations 
Id BigInt PrimaryKey 
User nvarchar(250) - Foreign to Users Table 
Date - DateTime 

Data I have is as follows. 
Users 
UserName FirstName LastName 
a  Small  A 
b  Small  B 

Registrations 
Id  User  Date 
1  A   1/1/12 
2  B   1/1/12 

कृपया ध्यान दें उपयोगकर्ता का मामला यहां कैप्स यह एसक्यूएल में मान्य है है, यह स्वीकार करता है।

अब मज़ा भाग। मैंने ईडीएमएक्स उत्पन्न किया, नेट 4.0 और अब मैं इस कोड को निष्पादित करता हूं।

using (EFTestEntities context = new EFTestEntities()) 
      { 
       var item = context.Registrations.Where(id => id.Id == 1).FirstOrDefault(); 
       Response.Write(item.User1.LastName); 
      } 

यह बस नल पॉइंटर एक्सेप्शन User 1 के साथ ब्रेक अशक्त फेंकता, जब मैं एक यह काम करता है के बजाय एक लिए पंजीकरण तालिका में उपयोगकर्ता नाम स्तंभ के मूल्य बदल जाते हैं।

कुछ हद तक इसी

यह Link एक और इसी तरह इस मुद्दे के बारे में यह Link वार्ता

अपने जवाब साझा करें क्यों इस व्यवहार, मेरे डीबी के मिलान केस-insentivity है। क्या आपको समान सामना करना पड़ा है?

उत्तर

7

समस्या यह है कि आपका डेटाबेस असंवेदनशील है लेकिन सीएलआर (.NET) डेटाबेस के विपरीत नहीं है और इसे विश्व स्तर पर असंवेदनशील मोड के मामले में स्विच नहीं किया जा सकता है - आपको प्रति तुलना करना चाहिए।

जब आप फोन item.User1.LastName एफई आलसी लोड हो रहा है ट्रिगर किया जाएगा - अतिरिक्त क्वेरी किसी संबंधित उपयोगकर्ता लोड करने के लिए डेटाबेस में निष्पादित किया जाता है, लेकिन जब उपयोगकर्ता materialized है एफई फिक्सिंग शुरू करने और अपने संबंधपरक मॉडल मान्य और यहाँ समस्या आता है - यह तार तुलना केस संवेदनशीलता के साथ इस सेटिंग के अनुसार aA के बराबर नहीं है और इसके कारण आपकी लोड User इकाई आपकी Registration इकाई से संबंधित नहीं है। नतीजतन ईएफ User1 संपत्ति को ठीक नहीं करेगा और यह शून्य रहेगा। इस तरह के मामले में LastName तक पहुंचने से NullReferenceException फेंक देगा।

  • अपने डेटाबेस को ठीक करें और यह सुनिश्चित करें कि इस मामले अंतर फिर
  • आपके डेटा में दिखाई नहीं देगा आप परियोजना की शुरुआत में हैं या यदि आप पूर्ण बनाती हैं:

    वहाँ केवल दो समाधान हैं डेटाबेस पर नियंत्रण इसे फिर से डिजाइन करें। NVarChar प्राथमिक कुंजी और विदेशी कुंजी खराब डेटाबेस डिज़ाइन हैं।

यदि इनमें से कोई भी विकल्प आपके लिए लागू नहीं है, तो आपको ऐसे डेटाबेस के साथ ईएफ का उपयोग करने से बचना चाहिए।

+0

मुझे इस बिंदु पर प्वाइंट 1 करना था क्योंकि डीबी परिवर्तन संभव नहीं है – Kusek

+0

@ladislav उत्तर के लिए धन्यवाद। यह जानकारी आसानी से स्पष्ट नहीं है लेकिन यह जानकर मुझे अपनी समस्या को ठीक करने के लिए आवश्यक अंतर्दृष्टि मिली है। मुझे अलग-अलग मामले पीके के साथ एक बहुत ही तेज विरासत डेटाबेस के साथ कुश्ती करना पड़ा, जिस पर मेरा कोई नियंत्रण नहीं था। सौभाग्य से मैं एक दृश्य का उपयोग कर समस्या को हल करने में सक्षम था और यह सुनिश्चित करने के लिए कि वे मेल खाते हैं, दोनों अपमानजनक तालिकाओं पर 'UPPER ([PrimaryKey])' कर रहे थे। मैं वास्तव में इस दृष्टिकोण की सिफारिश नहीं करता लेकिन मुझे अपने कार्यक्रम को काम करने के लिए ऐसा करना पड़ा। – theyetiman