दिलचस्प पोस्ट
एंड्रॉइड में प्रवेश करने के लिए मैं आउटपुट कैसे लिखूं? एसवीजी व्यू बॉक्स विशेषता स्विफ्ट क्लोज़ में वैकल्पिक चेनिंग जहां वापसी का प्रकार रिक्त होना चाहिए एसक्यूएल को प्रभावित तालिका में लॉग ऑन करने के लिए ट्रिगर बनाएँ? अनग्रेड ग्राफ़ में सभी चक्र ढूंढना मूल्य या संदर्भ से पारित पीएचपी चर रहे हैं? फेसबुक: असुरक्षित जावास्क्रिप्ट समस्या (document.domain मान समान होना चाहिए) बहुआयामी सरणी पुनरावृत्ति क्या php (जैसे मेल) में फ़ंक्शन को बदलना और इसे कुछ और करना संभव है? वेब फॉन्ट लोड होने पर एक बार अधिसूचित कैसे किया जाए सी अल्पविराम ऑपरेटर पोस्ट अनुरोध json डेटा java HttpUrlConnection भेजें AngularJS में कुकी के लिए समाप्ति दिनांक कैसे सेट करें छद्म-तत्व सामग्री के बाद :: या :: के लिए लाइन ब्रेक जोड़ें एसिंक्रोनस नेटवर्क अनुरोधों के साथ लूप के लिए तेज़ होने तक प्रतीक्षा करें

इकाई फ़्रेमवर्क: प्राथमिक कुंजी के बिना तालिका

मेरे पास एक मौजूदा डीबी है जिसके साथ मैं ईएफ 4.0 का इस्तेमाल करते हुए एक नया ऐप तैयार करना चाहता हूं

कुछ तालिकाओं में प्राथमिक कुंजी परिभाषित नहीं है, इसलिए जब मैं एक नया इकाई डेटा मॉडल बनाऊं, मुझे निम्न संदेश मिलता है: "तालिका / दृश्य TABLE_NAME में प्राथमिक कुंजी परिभाषित नहीं है और कोई मान्य प्राथमिक कुंजी अनुमानित नहीं हो सकती है। यह तालिका / दृश्य को हटा दिया गया है। इकाई का उपयोग करने के लिए, आपको अपनी स्कीमा की समीक्षा करना होगा, सही कुंजी जोड़ना होगा और इसे हटा देना होगा "।

अगर मैं उनका उपयोग करना चाहता हूं और डेटा को संशोधित करना चाहता हूं, तो क्या मैं आवश्यक रूप से उन तालिकाओं में एक पीके जोड़ना होगा, या कोई उपाय है जिससे मुझे नहीं चाहिए?

वेब के समाधान से एकत्रित समाधान "इकाई फ़्रेमवर्क: प्राथमिक कुंजी के बिना तालिका"

त्रुटि का अर्थ है कि यह क्या कहता है।

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

इस के आसपास काम न करें अपने डेटा मॉडल को ठीक करें

संपादित करें: मैंने देखा है कि बहुत से लोग इस प्रश्न को डाउनवॉट कर रहे हैं। यह ठीक है, मुझे लगता है, लेकिन ध्यान रखें कि ओपी ने प्राथमिक कुंजी के बिना एक तालिका के मानचित्रण के बारे में पूछा, न कि दृश्य । जवाब अभी भी वही है ईएफ के लिए तालिकाओं पर एक पीके की आवश्यकता के आसपास कार्य करना प्रबंधन की दृष्टि से, डेटा अखंडता और प्रदर्शन से एक बुरा विचार है।

कुछ लोगों ने टिप्पणी की है कि उनके पास अंतर्निहित डेटा मॉडल को ठीक करने की क्षमता नहीं है क्योंकि वे एक तृतीय-पक्ष अनुप्रयोग के लिए मानचित्रण कर रहे हैं यह एक अच्छा विचार नहीं है, जैसा कि मॉडल आपके नीचे से बदल सकता है। बेशक, उस मामले में आप एक दृश्य में मैप करना चाहते हैं, जो फिर से, ओपी ने क्या पूछा नहीं है।

मुझे लगता है कि यह टिलिटो द्वारा हल किया गया है:

इकाई फ़्रेमवर्क और SQL सर्वर देखें

मैं नीचे अपनी प्रविष्टि उद्धृत करूंगा:

हमारे पास एक ही समस्या थी और यह समाधान है:

एक प्राथमिक कुंजी के रूप में स्तंभ का उपयोग करने के लिए एंटिटी फ़्रेमवर्क को बल देने के लिए, ISNULL का उपयोग करें।

एक प्राथमिक कुंजी के रूप में स्तंभ का उपयोग न करने के लिए इकाई ढांचा को मजबूर करने के लिए, NULLIF का उपयोग करें

इसे लागू करने का एक आसान तरीका दूसरे चयन में आपके दृश्य का चयन बयान लपेट करना है

उदाहरण:

SELECT ISNULL(MyPrimaryID,-999) MyPrimaryID, NULLIF(AnotherProperty,'') AnotherProperty FROM ( ... ) AS temp 

जवाब दिया अप्रैल 26 '10 पर 17:00 टिलिटो ने

यह समाधान काम करता है

आपको मैन्युअल रूप से नक्शा करने की आवश्यकता नहीं है, भले ही आपके पास पीके न हो। आपको ईएफ को यह बताने की ज़रूरत है कि आपके कॉलम में से एक सूचकांक है और सूचकांक स्तंभ नल योग्य नहीं है।

ऐसा करने के लिए आप अपने दृश्य के साथ एक पंक्ति संख्या जोड़ सकते हैं, जैसे निम्न कार्य निम्न है

 select ISNULL(ROW_NUMBER() OVER (ORDER BY xxx), - 9999) AS id from a 

ISNULL(id, number) मुख्य बिंदु है क्योंकि यह ईएफ को बताता है कि यह कॉलम प्राथमिक कुंजी हो सकता है

समग्र कुंजी को इकाई फ़्रेमवर्क फ़्लुएंट एपीआई के साथ भी किया जा सकता है

 public class MyModelConfiguration : EntityTypeConfiguration<MyModel> { public MyModelConfiguration() { ToTable("MY_MODEL_TABLE"); HasKey(x => new { x.SourceId, x.StartDate, x.EndDate, x.GmsDate }); ... } } 

ईएफ को डेटाबेस पर प्राथमिक कुंजी की आवश्यकता नहीं है अगर ऐसा हुआ, तो आप संस्थाओं को विचारों में बाँध नहीं सके।

आप अपनी प्राथमिक कुंजी के रूप में एक अद्वितीय फ़ील्ड निर्दिष्ट करने के लिए एसएसडीएल (और सीएसडीएल) को संशोधित कर सकते हैं। अगर आपके पास एक अद्वितीय क्षेत्र नहीं है, तो मेरा विश्वास है कि आप को रोक दिया गया है लेकिन वास्तव में आपके पास एक अद्वितीय क्षेत्र (और पीके) होना चाहिए, अन्यथा आप समस्याओं में बाद में चलेंगे।

एरिक

मेरे मामले में मुझे किसी दृश्य को एक मानचित्र में मानचित्रित करना पड़ा, जिसमें प्राथमिक कुंजी नहीं थी इसके अलावा, मुझे इस दृश्य को संशोधित करने की अनुमति नहीं थी। सौभाग्य से, इस व्यू में कॉलम था जो एक अद्वितीय स्ट्रिंग था। मेरा समाधान इस स्तंभ को प्राथमिक कुंजी के रूप में चिह्नित करना था:

 [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] [StringLength(255)] public string UserSID { get; set; } 

धोखा दिया ईएफ पूरी तरह से काम किया, कोई भी नहीं देखा … 🙂

उपरोक्त उत्तर सही हैं यदि आपके पास कोई पीके नहीं है।

लेकिन अगर वहाँ एक है, लेकिन यह सिर्फ डीबी में एक इंडेक्स के साथ निर्दिष्ट नहीं है, और आप डीबी (हाँ, मैं डिलबर्ट की दुनिया में काम करता है) को नहीं बदल सकता है, तो आप मैन्युअल रूप से फ़ील्ड को कुंजी के रूप में मैप कर सकते हैं

एक बेकार पहचान की कुंजी होने पर कई बार व्यर्थ है मुझे पता है कि आईडी का उपयोग नहीं किया गया है, इसे क्यों जोड़ें? हालांकि, इकाई इसके बारे में इतना क्षमा नहीं कर रही है, इसलिए आईडी फ़ील्ड जोड़ना सबसे अच्छा होगा। यहां तक ​​कि इस मामले में भी इसका उपयोग नहीं किया गया है, यह इकाई की अनुपस्थिति पहचान के बारे में त्रुटियों से निपटने से बेहतर है।

  1. टेबल संरचना बदलें और प्राथमिक कॉलम जोड़ें मॉडल को अपडेट करें
  2. XML संपादक में .MEMX फ़ाइल को संशोधित करें और इस विशिष्ट तालिका के लिए टैग के तहत एक नया कॉलम जोड़ने का प्रयास करें (काम नहीं करेगा)
  3. तालिका को बाहर करने के लिए एक नया प्राथमिक स्तंभ बनाने के बजाय, मैं सभी मौजूदा कॉलम ( वर्कड ) को शामिल करके एक समग्र कुंजी बनाऊंगा।

इकाई फ़्रेमवर्क: एंटिटी मॉडल के लिए प्राथमिक कुंजी के साथ डेटाटाले जोड़ने

एरिक टी के उत्तर के लिए यह सिर्फ एक अतिरिक्त है यदि अद्वितीय मूल्यों के साथ कोई एकल स्तंभ नहीं है, तो समाधान निम्न प्रकार से एक समग्र कुंजी का उपयोग करना है:

 [Key] [Column("LAST_NAME", Order = 1)] public string LastName { get; set; } [Key] [Column("FIRST_NAME", Order = 2)] public string FirstName { get; set; } 

दोबारा, यह सिर्फ एक वैकल्पिक हल है वास्तविक समाधान डेटा मॉडल को ठीक करना है

व्यावहारिक दृष्टिकोण से, हर तालिका – एक गोदाम तालिका की तरह एक denormalized तालिका – एक प्राथमिक कुंजी होना चाहिए या, असफल होने पर, कम से कम एक अद्वितीय, गैर-नल योग्य सूचकांक होना चाहिए।

किसी तरह की अनूठी कुंजी के बिना, डुप्लिकेट रिकॉर्ड तालिका में दिखाई दे सकते हैं, जो कि ओएमएम परतों के लिए बहुत ही समस्याग्रस्त है और डेटा के बुनियादी समझ के लिए भी है। एक तालिका जिसमें डुप्लिकेट रिकॉर्ड हैं, शायद खराब डिज़ाइन का एक लक्षण है।

बहुत कम से कम, तालिका में कम से कम एक पहचान कॉलम होना चाहिए। एक ऑटो-जनरेटिंग आईडी कॉलम को जोड़ने से SQL सर्वर में लगभग 2 मिनट और ओरेकल में 5 मिनट लगते हैं। उस अतिरिक्त प्रयास के लिए, कई, कई समस्याएं टाल दी जाएंगी।

हमने इस समस्या का भी सामना किया, और जब हमारे पास एक स्तंभ था जो शून्य था, तो क्या महत्वपूर्ण था कि हमारे पास एक निर्भर कॉलम था जिसके पास नल नहीं था और ये दोनों स्तंभों का संयोजन अद्वितीय था

प्रताप रेड्डी द्वारा दी गई प्रतिक्रिया का हवाला देते हुए, यह हमारे लिए ठीक काम किया।

उत्तर देने में देर हो सकती है … हालांकि …

यदि एक तालिका में प्राथमिक कुंजी नहीं होती है, तो कुछ परिदृश्य हैं जिनके लिए ठीक से ईएफ कार्य करने के लिए विश्लेषण किया जाना आवश्यक है नियम है: ईएफ प्राथमिक कुंजी के साथ तालिकाओं / कक्षाओं के साथ काम करेगा। यही वह ट्रैकिंग करता है …

कहते हैं, आपकी तालिका 1. रिकॉर्ड्स अद्वितीय हैं: एक एकल विदेशी कुंजी कॉलम द्वारा विशिष्टता बनाई गई है: 2. रिकॉर्ड्स अद्वितीय हैं: विशिष्ट स्तंभ एकाधिक कॉलमों के संयोजन द्वारा बनाए जाते हैं। 3. रिकॉर्ड्स अद्वितीय नहीं हैं (अधिकांश भाग * के लिए)

परिदृश्य # 1 और # 2 के लिए आप निम्न पंक्ति को डीबीसीओन्टेक्स्ट मॉड्यूल ऑनमोडेल क्रिएटिंग पद्धति में जोड़ सकते हैं: modelBuilder.Entity ()। HasKey (x => new {x.column_a, x.column_b}); // जितने कॉलम हैं, उतना ही रिकॉर्ड अद्वितीय बनाते हैं।

परिदृश्य # 3 के लिए आप टेबल का अध्ययन करने के बाद भी उपरोक्त समाधान (# 1 + # 2) का उपयोग कर सकते हैं (* जो भी सभी रिकॉर्ड अद्वितीय बनाती हैं)। यदि आप सभी कॉलमों को सभी रिकॉर्ड अद्वितीय बनाने के लिए शामिल करना होगा, तो आप अपनी तालिका में एक प्राथमिक कुंजी कॉलम जोड़ना चाह सकते हैं। अगर यह तालिका तीसरी पार्टी के विक्रेता से है तो इस तालिका को अपने स्थानीय डाटाबेस (रातोंरात या जितनी बार आपको आवश्यक है) को क्लोन स्क्रिप्ट के माध्यम से प्राथमिक कुंजी कॉलम के साथ क्लोन जोड़ा गया है।

तालिका में केवल एक स्तंभ होना चाहिए जो नल की अनुमति नहीं देता है