2015-10-07 9 views
17

में स्ट्रिंग प्रॉपर्टी को प्राथमिक कुंजी के रूप में कैसे उपयोग करें IF में नया हूं और ईटीएफ 6.0 में कोड के पहले दृष्टिकोण से अपना पहला कदम करने का प्रयास करें और अब मुझे कोई समस्या है।एंटिटी फ्रेमवर्क

मैं एक संपत्ति

[Key] 
public string FooId { get; set; } 

जो मॉडल के लिए मेरी प्राथमिक कुंजी है।

लेकिन अगर मैं डेटाबेस मैं निम्न त्रुटि प्राप्त करने के लिए माइग्रेशन लंबित अपडेट करने के लिए पैकेज प्रबंधक कंसोल

PM> Update-Database

कमांड चलाएँ: अगर मैं करने के लिए अपने मॉडल में पी बदलने

Identity column 'FooId' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with a scale of 0, and constrained to be nonnullable.

[Key] 
public int FooId { get; set; } 

सब कुछ ठीक काम करता है।

लेकिन मुझे पीके को प्रकार की स्ट्रिंग होने की आवश्यकता होगी क्योंकि यह मेरे मामले में बिल्कुल समझ में आता है। मुझे पता है कि नुकसान हैं लेकिन मेरे लिए यह जरूरी है।

मैंने यहां एक पुरानी पोस्ट देखी है How to make string as primary key in entity framework!

लेकिन ऐसा लगता है कि मेरी समस्या का समाधान नहीं है या मैं इसे समझ में नहीं आता हूं।

क्या यह वास्तव में है कि मैं एसक्यूएल डेटाबेस पर पीके के रूप में स्ट्रिंग का उपयोग नहीं कर सकता?

या ऐसा करने का कोई तरीका है?

+0

कुंजी, पहचान करने के लिए चूक है, ताकि आप विशेषता के आधार पर इसे बंद करने की जरूरत है '[DatabaseGenerated (DatabaseGeneratedOption.None)] 'इसका मतलब है कि जोड़ते समय आपको मैन्युअल रूप से कुंजी निर्दिष्ट करने की आवश्यकता है (यह उत्पन्न नहीं हुआ है)। – Hopeless

उत्तर

29

यह पहचान AutoIncrement के बिना एक पी बनाने का उचित तरीके से सक्षम है:

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public string FooId { get; set; } 
2

यदि आपको स्ट्रिंग होने के लिए अपनी प्राथमिक कुंजी की आवश्यकता है, तो इसे पहचान कॉलम न बनाएं। पहचान कॉलम आपके लिए प्राथमिक कुंजी मान उत्पन्न करेंगे, यदि आप मूल्यों को स्वयं उत्पन्न करना चाहते हैं तो आपको बंद करना चाहिए।

1

प्राथमिक कुंजी के रूप में स्ट्रिंग रखने का आपका कारण क्या है?

मैं केवल प्राथमिक कुंजी को एक ऑटो incrementing पूर्णांक फ़ील्ड में सेट कर दूंगा, और स्ट्रिंग फ़ील्ड पर एक अनुक्रमणिका डाल दूंगा।

इस तरह यदि आप तालिका में खोज करते हैं तो उन्हें अपेक्षाकृत तेज़ होना चाहिए, और आपके सभी जुड़ने और सामान्य लुकअप उनकी गति में अप्रभावित होंगे।

आप अनुक्रमित होने वाले स्ट्रिंग फ़ील्ड की मात्रा को भी नियंत्रित कर सकते हैं। दूसरे शब्दों में, आप कह सकते हैं कि "केवल पहले 5 वर्णों को इंडेक्स करें" यदि आपको लगता है कि यह पर्याप्त होगा। या यदि आपका डेटा अपेक्षाकृत समान हो सकता है, तो आप पूरे क्षेत्र को अनुक्रमित कर सकते हैं।

+0

मुझे लगता है कि उनका तर्क मेरा जैसा ही था: आप इसका उपयोग कर सकते हैं। Find (fooId) ओडी संदर्भ ऑब्जेक्ट और इकाई फ्रेमवर्क के पहले स्तर कैशिंग को लागू करें मैं इसे उपयोगकर्ता नाम के लिए उपयोग करता हूं –

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