2011-08-03 11 views
5

के साथ नई पंक्ति जोड़ें मेरे पास एक SQL सर्वर डेटाबेस में एक तालिका है जिसे मैं एक पंक्ति जोड़ना चाहता हूं। प्राथमिक कुंजी ऑटो वृद्धि नहीं है और मैं नहीं चाहता हूं कि यह हो। हालांकि, इस अवसर पर, मैं अगले उपलब्ध मूल्य के साथ एक पंक्ति जोड़ना चाहता हूं। क्या ऐसा करने के लिए एक सरल तरीका है? मुझे पता है कि मैं अधिकतम मूल्य के लिए तालिका से पूछताछ कर सकता हूं और फिर इसे बढ़ा सकता हूं लेकिन ईएफ का उपयोग करते समय क्या कोई आसान तरीका है?.NET इकाई फ्रेमवर्क वृद्धिशील प्राथमिक कुंजी

यदि कोई अलग क्वेरी MAX मान प्राप्त करने में सक्षम है तो आप LINQ के साथ ऐसा कैसे करेंगे?

उत्तर

5

यह आवश्यक होगा जब तक कि सर्वर पहचान या गणना कॉलम न हो, ऐसे मामले में आप नीचे कुछ ऐसा कर सकते हैं।

myRecord.ID = Context.Records.Max(record => record.ID) + 1; 
+1

धन्यवाद कि काम किया। – Jonnster

3

इसके लिए कोई आसान तरीका नहीं है, खासकर यदि आप अगले उपलब्ध मूल्य (= कोई अंतराल) पर जोर देते हैं। आपको ऑटो वृद्धि मूल्य का उपयोग करना चाहिए और यह आपके एप्लिकेशन को बेहतर प्रदर्शन करेगा।

समस्या क्या है?

  1. आप डेटाबेस से एक मूल्य प्राप्त करने की आवश्यकता
  2. आप अपने इकाई
  3. निर्दिष्ट करने के लिए की जरूरत है आप डेटाबेस

आसान लग रहा है करने के लिए इकाई को बचाने की जरूरत नहीं है, यह? नहीं, यदि आपके समवर्ती वातावरण नहीं हैं तो अधिकतर एक धागा चरण 1 कर सकता है। समसामयिक रूप से अन्य थ्रेड चरण 3 तक पहुंचने से पहले = = सभी थ्रेड एक ही मान के साथ रिकॉर्ड डालेंगे।

इससे कैसे निपटें? एक तरीका है मूल्य को प्राप्त करने और बढ़ाने के लिए अधिकतम मूल्य और परमाणु संचालन के साथ अलग तालिका का उपयोग करना। मैं कुछ कर रही प्रक्रिया संग्रहीत लगता है कि इस तरह परमाणु होना चाहिए:

DECLARE @Result INT 
UPDATE SequenceTable SET @Result = MaxValue = MaxValue + 1 WHERE SequnceName = '...' 
RETURN @Result 

संग्रहीत प्रक्रिया करने के लिए कॉल सबसे अच्छा प्रवाह बनाने के लिए किसी भी लेनदेन के बाहर होना चाहिए।

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

आप नहीं चाहते हैं अंतराल आप लेन-देन में संग्रहीत प्रक्रिया कॉल और ऑपरेशन में डाल दिया जाना चाहिए ताकि अनुक्रम तालिका में है कि रिकॉर्ड जब तक डेटा के लिए प्रतिबद्ध हैं बंद है।

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