2012-11-10 7 views
8

मैं getters और setters के साथ एक सरल वस्तु बनाया है: (आईडी नहीं बनाते?

try 
{ 
    memberObj.username = username; 
    memberObj.email = email; 
    memberObj.status = "active"; 
    // memberObj.Id = new ObjectId().ToString(); 
    this.membershipcollection.Insert(memberObj, SafeMode.True); 
    return true; 
} 
catch(Exception ex) 
{ 
    return false; 
} 

मैं डालने के लिए एक अनूठा _ id बनाने के लिए उम्मीद करेंगे:

public class MemberCanonical : IMemberCanonical 
{ 
    public ObjectId Id { get; set; } 
    public String username { get; set; } 
    public String email { get; set; } 
    public String status { get; set; } 
    public IEnumerable<string> roles { get; set; } 
} 

अब मैं के साथ डेटाबेस में एक नए सदस्य सम्मिलित करना चाहते हैं आईडी), लेकिन ऐसा नहीं हो रहा है। जब मैं _id फ़ील्ड देखता हूं तो मुझे "0000000 ...."

मोंगो को अपना स्वयं का _id डालने के लिए क्या करने की आवश्यकता है?

+1

कभी-कभी मैं उन विषयों में सवालों का जवाब देना पसंद करता हूं जिनके बारे में मुझे कुछ नहीं पता है। यहां बताया गया है कि मैंने क्या पाया: आप 'ऑब्जेक्टआईडी.जनेटनेट न्यूआईडी()' का उपयोग करके स्वयं को उत्पन्न कर सकते हैं - आप इसे 'सदस्य कैनोनिकल' के निर्माता में कर सकते हैं, या 'ऑब्जेक्टआईडी.एक्टी' के खिलाफ डालने के दौरान आईडी को चेक कर सकते हैं। इसके बाद, यह संभव है * इसे '_id' कहा जाना चाहिए, मुझे उस पर बिल्कुल यकीन नहीं है। मैं 'ऑब्जेक्टआईडी?' का उपयोग करने की कोशिश भी करूंगा और अपना मान 'नल' पर सेट करूंगा, लेकिन यह एक जंगली अनुमान है। – Kobi

+0

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

+2

क्या किसी के पास कोई ऐसा समाधान है जिसके लिए मोनो डीबी प्रकारों पर निर्भरता जैसे दृढ़ता के साथ डोमेन मॉडल को प्रदूषित करने की आवश्यकता नहीं है? – Kurt

उत्तर

11

बस अपनी आईडी संपत्ति को [BsonId] विशेषता के साथ चिह्नित करें, और उत्पन्न आईडी मान वहां होगा!

public class MemberCanonical : IMemberCanonical 
{ 
    [BsonId] 
    public ObjectId Id { get; set; } 

this.membershipcollection.Insert(memberObj, SafeMode.True); 
var idYouLookingFor = memberObj.Id; 

या वैकल्पिक तरीका, @Kobi ने सुझाव दिया: "ईद के बजाय उपयोग _ id क्षेत्र का नाम" भी काम करना चाहिए।

+1

मैंने अपनी आईडी संपत्ति पर [BsonId] विशेषता का उपयोग किया और मुझे स्वचालित रूप से जेनरेट किए गए आईडी मान नहीं मिला। हालांकि, मेरी आईडी संपत्ति एक स्ट्रिंग है। क्या आपको पता चलेगा कि इसे ऑब्जेक्टआईडी टाइप करना है या नहीं? –

+0

वैसे, आईडी प्रॉपर्टी को 'ऑब्जेक्ट आईडी' टाइप किया गया था और * बिना * 'BsonId' विशेषता है। –

-1

जो भी अद्वितीय संपत्ति आप उपयोग करना चाहते हैं उस पर [BsonId] का उपयोग करें। आप ObjectID प्रकार को भी अनदेखा कर सकते हैं और अपना खुद का बना सकते हैं।

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

[BsonId] 
public string studentid{get; set;} 
+1

यह दो साल पहले से एक जवाब के समान है। –

4

मैं [BsonId] विशेषता और निर्माता क्रमांक मान बनाने के लिए का एक संयोजन का उपयोग करें।

उदाहरण

public class Something { 

    [BsonId] 
    public string Id { get; set; } 

    public Something() { 
     this.Id = ObjectId.GenerateNewId().ToString(); 
    } 

} 

इस के लिए इतना है कि मैं हमेशा वस्तु के लिए एक आबादी वाले क्रमांक फ़ील्ड है। जब डेटाबेस को डेटाबेस से पुनर्प्राप्त किया जाता है, तो आईडी फ़ील्ड डेटाबेस से वास्तविक आईडी मान के साथ ओवरराइट किया जाता है। विन विन।

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