2008-09-23 22 views
48

क्या इकाई कॉलम पहचान कॉलम के बारे में जागरूक है?एडीओ.NET इकाई फ्रेमवर्क और पहचान कॉलम

मैं SQL सर्वर 2005 एक्सप्रेस संस्करण का उपयोग कर रहा हूं और कई टेबल हैं जहां प्राथमिक कुंजी एक पहचान कॉलम है। जब मैं एक इकाई मॉडल बनाने के लिए इन टेबल का उपयोग करता हूं और एक नई इकाई बनाने के लिए एक फॉर्मेट में एक इकाई डेटासॉर बॉन्ड के संयोजन के साथ मॉडल का उपयोग करता हूं तो मुझे पहचान कॉलम के लिए एक मान दर्ज करने के लिए कहा जाता है। फ्रेमवर्क को पहचान कॉलम के लिए मूल्यों के लिए नहीं पूछने का कोई तरीका है?

उत्तर

2

इकाई फ्रेमवर्क जागरूक है और पहचान कॉलम को संभाल सकता है।

आपकी समस्या शायद ईएफ नहीं बल्कि इसके उत्पन्न जेनरेट हो सकती है। सम्मिलित फॉर्म से पहचान कॉलम के लिए इनपुट को हटाने का प्रयास करें और देखते हैं कि क्या होता है।

4

आपको पहचान कॉलम की पहचान विनिर्देश सेट करना चाहिए ताकि (पहचान पहचान) संपत्ति सत्य पर सेट हो। आप एसएसएमएस में अपने टेबल डिजाइनर में ऐसा कर सकते हैं। फिर आपको इकाई डेटा मॉडल को अपडेट करने की आवश्यकता हो सकती है।

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

2

यदि आपके बालों को बाहर निकालने से पहले अन्य सभी विफल हो जाते हैं - तो अपनी EntityModel को हटाने और SQL सर्वर से पुनः आयात करने का प्रयास करें। यदि आप चाबियाँ और रिश्तों को बदल रहे हैं और 'डेटाबेस से अपडेट मॉडल' पर भरोसा करते हैं तो यह आरसी संस्करण में अभी भी थोड़ी छोटी गाड़ी है - एक नया आयात मदद कर सकता है।

+0

यह अभी भी 7 साल बाद सच है। रीफ्रेश मेरे मुख्य परिवर्तन नहीं उठा रहा था। एक ताजा मॉडल बनाने से इस मुद्दे को हल किया गया। – nunzabar

67

मुझे पता है कि यह पोस्ट काफी पुराना है, लेकिन इससे अगले व्यक्ति को "एंटीटी फ्रेमवर्क" और "पहचान" के लिए Google खोज के माध्यम से सुनने में मदद मिल सकती है।

ऐसा लगता है कि इकाई फ्रेमवर्क सर्वर-जेनरेट की गई प्राथमिक कुंजी का सम्मान करता है, क्योंकि मामला "पहचान" संपत्ति सेट होने पर होगा। हालांकि, एप्लिकेशन साइड मॉडल को अभी भी CreateYourEntityHere विधि में प्राथमिक कुंजी की आपूर्ति की आवश्यकता है। यहां निर्दिष्ट कुंजी को संदर्भ में SaveChanges() पर कॉल किया गया है।

पृष्ठ here इस बारे में विस्तृत जानकारी देता है।

1

इकाई ढांचे किसी कारण से पहचान पूरी तरह से समझ में नहीं आता है। सही वर्कअराउंड उस कॉलम के लिए सेटर को निजी पर सेट करना है। इससे कोई भी जेनरेट किया गया यूआई समझ जाएगा कि इसे पहचान मान सेट नहीं करना चाहिए क्योंकि यह एक निजी क्षेत्र सेट करना असंभव है।

+0

इस मामले में, आप कुंजी के माध्यम से इकाई को संपादित करने में सक्षम नहीं होंगे, क्योंकि मान अद्यतन ऑब्जेक्ट के लिए 0 होगा और आप अपरिवर्तित परिवर्तनों को सहेजने में सक्षम नहीं होंगे क्योंकि आप कुंजी के माध्यम से संग्रह में ऑब्जेक्ट नहीं ढूंढ पाएंगे। (यह मामला एमवीसी के लिए है) – Chinjoo

0

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

3

यह मैंने देखा है सबसे अच्छा जवाब है। UniqueIdentifier के प्रत्येक प्राथमिक कुंजी पर StoreGeneratedPattern="Identity" सेट करने के लिए आपको स्टोरेज लेयर xml मैन्युअल रूप से संपादित करना होगा, जिसमें डिफ़ॉल्ट मान NewID() पर सेट है।

http://web.archive.org/web/20130728225149/http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

+0

इस सलाह को पढ़ने के बाद, मुझे पता चला कि एक लापता पहचान जोड़ा गया है, लेकिन ईएफ को सब कुछ ठीक करने के लिए इकाई डेटा मॉडल में ऑब्जेक्ट को छोड़ने और रीफ्रेश करने की आवश्यकता है। – goosemanjack

0

मैं इस पर विश्वास नहीं कर सकते। Intellisensing ItemCollection SaveChanges के बाद ID = 0 के साथ एकल आइटम उत्पन्न करता है।

  Dim ItemCollection = From d In action.Parameter 
      Select New STOCK_TYPE With { 
         .Code = d.ParamValue.<Code>.Value, 
         .GeneralUseID = d.ParamValue.<GeneralUse>.Value, 
      } 


      GtexCtx.STOCK_TYPE.AddObject(ItemCollection.FirstOrDefault) 
      GtexCtx.SaveChanges() 

कोई फर्क नहीं पड़ता कि मैं क्या करता हूं। 8 घंटे के बाद, मेरे मॉडल को हटाने, 35 गुना निर्माण और पुनर्निर्माण, ईडीएमएक्स के एक्सएमएल का प्रयोग और संपादन और अब लगभग मेरे पूरे SQL सर्वर डेटाबेस को हटाने के लिए आ रहा है।36 वें संकलन, इस dumbfounding समाधान काम किया

  Dim abc = ItemCollection.FirstOrDefault 
      GtexCtx.STOCK_TYPE.AddObject(abc) 
      GtexCtx.SaveChanges() 

abc.ID उपज 41 (पहचान मैं आवश्यक)

संपादित करें: यहाँ AddObject पाशन के लिए विचार के लिए एक सरल कोड है और अभी भी आईडी प्राप्त

Dim listOfST As List(Of STOCK_TYPE) = ItemCollection.ToList() 
     For Each q As STOCK_TYPE In listOfST 
     GtexCtx.STOCK_TYPE.AddObject(q) 
     Next 
GtexCtx.SaveChanges() 

...more code for inter-relationship tables 

SaveChanges के बाद Intellisence listOfST आज़माएं और आपको अपडेट की गई आईडी मिल जाएगी। हो सकता है कि वहाँ बेहतर तरीका है, लेकिन अवधारणा वहाँ

2

सी # में आप कुछ इस तरह कर सकते हैं यह जागरूक बनाने के लिए है:

अपने FooConfiguration.cs : EntityTypeConfiguration<Foo> में:

this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

तो यह उपयोग करने के लिए, बस के लिए सुनिश्चित हो अद्यतन ऑटो-वर्धित मूल्य प्राप्त करने के लिए x.foo का उपयोग करने से पहले आइटम को संदर्भ में सम्मिलित करें और context.SaveChanges() पर कॉल करें। अन्यथा x.foo सिर्फ 0 या शून्य होगा।

5

यदि आप एंटीटी फ्रेमवर्क 5 का उपयोग कर रहे हैं, तो आप निम्न विशेषता का उपयोग कर सकते हैं।

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
संबंधित मुद्दे