2013-01-13 13 views
19

एक पहचान है कि एक मेज के लिए:सर्विसस्टैक OrmLite में स्वतः-वृद्धि आईडी कैसे पुनर्प्राप्त करें?

[AutoIncrement] 
    public int Id { get; set;} 

जब डेटाबेस में एक नई पंक्ति डालने, वस्तु की पहचान को पुनः प्राप्त करने का सबसे अच्छा तरीका क्या है?

उदाहरण के लिए:

db.Insert <> (नया उपयोगकर्ता());

आईडी के मूल्य डालने के बाद 0 है, लेकिन डेटाबेस में यह स्पष्ट रूप से मामला नहीं है। एकमात्र संभावना जो मैं देख सकता हूं वह निम्नलिखित है:

Id = (int)db.GetLastInsertId(); 

हालांकि मुझे विश्वास नहीं है कि यह एक सुरक्षित कॉल होगा। यदि एक ही समय में 100 प्रविष्टियां हो रही हैं, तो एक अन्य डालने के लिए एक आईडी वापस किया जा सकता है। ईएफ में जब आप एक सम्मिलित करते हैं तो आईडी आपके लिए सेट की जाती है।

क्या किसी को इसके बारे में जाने का सबसे अच्छा तरीका पता है?

उत्तर

26

ServiceStack.OrmLite में v4 जो पैरामिट्रीकृत प्रश्नों का उपयोग कर वहाँ जैसे db.Save() में विकल्पों में से एक जोड़े, जो स्वत: AutoIncrement ईद भरता है, कर रहे हैं करने के लिए चूक:

db.Save(item); 
item.Id //populated with the auto-incremented id 

नहीं तो आप पिछले डालने आईडी का उपयोग कर चयन कर सकते हैं :

var itemId = db.Insert(item, selectIdentity:true); 

यहां more examples showcasing OrmLite's new API's हैं।


OrmLite v3

सही कॉल के लिए db.GetLastInsertId() जो उदाहरण के लिए हुड के नीचे एसक्यूएल सर्वर के लिए कहता है SELECT SCOPE_IDENTITY() जो कि कनेक्शन के लिए पिछले डाला आईडी रिटर्न है।

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

+0

ओह तो यह प्रति कनेक्शन है! अब यह और अधिक समझ में आता है। – Dylan

+0

v3 पर स्पष्टीकरण के लिए धन्यवाद! db.GetLastInsertId() काम नहीं कर रहा है हालांकि यह एक छिपी विधि है जो मुझे लगता है .... कोई संकेतक? – theoutlander

2

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

ormLite में, आप IDbCommand और IDbTransaction के माध्यम से इस लागू कर सकते हैं (यहाँ http://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs उदाहरण देखें)

कोड को देखते हुए, आप यह कम जादुई और अधिक मैनुअल कोडिंग होने वाला है पर ध्यान देंगे, लेकिन यह एक तरीका है।

+0

कार्य इकाई के बारे में पढ़ेगा और नमूना स्रोत देखेंगे। – Dylan

2

अद्यतन: here जैसा देखा गया है, यदि आप सर्विसस्टैक/ORMLite v4 का उपयोग कर रहे हैं, तो आपको डालने वाली आईडी प्राप्त करने के लिए पैरामीटरयुक्त क्वेरी का उपयोग करने की आवश्यकता है। उदाहरण के लिए:

var UserId = db.Insert<User>(new User(), selectIdentity: true); 
संबंधित मुद्दे