2011-10-08 8 views
16

मेरे पास कक्षा User है और मुझे वेब सेवाओं में उनके साथ काम करने की आवश्यकता है।मोंगोडीबी सी #: आईडी सीरियलाइजेशन सर्वोत्तम पैटर्न

तब समस्या यह है कि अगर मैं Id क्रमानुसार करने है कि BsonObjectId के प्रकार के प्रयास करते हैं, मैं एक खाली संपत्ति है कि देखते हैं, कि एक खाली संपत्ति है, और इतने पर ...

मैं इस समाधान बारे में है क्रम में, यह एक अच्छा समाधान है?

public partial class i_User 
{ 
    [BsonId(IdGenerator = typeof(BsonObjectIdGenerator))] 
    [NonSerialized] 
    public BsonObjectId _id; 

    public String Id 
    { 
     get 
     { 
      return this._id.ToString(); 
     } 
    } 
} 

इस तरह, मैं _IdBsonObjectId के रूप में रख सकते हैं, लेकिन मैं संपत्ति Id में वेब पर एक स्ट्रिंग प्रतिनिधित्व भेजें।

एक अन्य समाधान StringObjectIdGenerator

public partial class i_User 
{ 
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))] 
    public String id; 
} 

के साथ काम करने लेकिन देखना है कि MongoDB ObjectId के बजाय डेटाबेस में एक string की दुकान नहीं है।

वेब सेवाओं और/या क्लाइंट-सर्वर (फ्लैश + सी #) जैसे क्रमिकरण पर्यावरण में काम करने के लिए सबसे अच्छा तरीका क्या है?

उत्तर

90

यदि मैं आपको सही ढंग से समझता हूं, तो आप Id संपत्ति को स्ट्रिंग के रूप में एक्सेस करना चाहते हैं, लेकिन Id को ObjectId में मोंगोडीबी में सहेजा गया है। इसे BsonRepresentation का उपयोग करके BsonId के साथ पूरा किया जा सकता है।

[BsonId] 
[BsonRepresentation(BsonType.ObjectId)] 
public string Id { get; set; } 

विवरण here पाया जा सकता है।

+3

धन्यवाद! यदि मैं कर सकता था तो मैं आपके लिए दो बार वोट दूंगा;) – Doobi

+1

आपने अभी अपना दिन बचाया है – emreturan

+1

एक वेबपी प्रतिक्रिया से 2 घंटे खर्च करें जो कच्चे ऑब्जेक्ट आईडी को क्रमबद्ध नहीं करेगा। यह मुझे शायद 2 घंटे घंटे बचाया –

6

आप एक कक्षा मानचित्र के साथ यह करने के लिए चाहते हैं - इस तरह से यह करने के लिए है:

BsonClassMap.RegisterClassMap<i_User>(cm => 
{ 
    cm.AutoMap(); 
    cm.SetIdMember(cm.GetMemberMap(x => x.Id) 
    .SetIdGenerator(StringObjectIdGenerator.Instance)); 
}); 
+0

यह एक बहुत अच्छा तरीका है जहां पीओसीओ साफ रहता है जो मेरी मुख्य चिंता है। लेकिन यह वास्तव में मोंगो में स्ट्रिंग के रूप में आईडी स्टोर करेगा। आदर्श डेटाबेस में ऑब्जेक्टआईड प्रतिनिधित्व और पीओसीओ में स्ट्रिंग प्रतिनिधित्व होना होगा। क्या यह संभव है? –

+0

मुझे पता नहीं है, लेकिन मुझे लगता है कि आप सी # ड्राइवर को संशोधित कर सकते हैं। ऑब्जेक्टआईडी का उपयोग करने का उद्देश्य यह केवल 12 बाइट्स लेता है और इसमें टाइमस्टैम्प में निर्माण होता है। क्यों नहीं अपने डोमेन इकाइयों में ObjectId का उपयोग करें? – Lybecker

+1

त्वरित उत्तर के लिए धन्यवाद। मैं आमतौर पर भंडारण परत तकनीक के अपने डोमेन परत स्वतंत्र होना चाहता हूँ। लेकिन मुझे लगता है कि सब कुछ एक व्यापार बंद है। –

1

वहाँ भी है एक अधिक सामान्य सम्मेलनों का उपयोग कर दृष्टिकोण। यह दृष्टिकोण आपको एक ही स्थान पर सभी मॉडलों के लिए नियम सेट करने की अनुमति देता है।

पहले। आईडी जनरेटर

public class IdGeneratorConvention : ConventionBase, IPostProcessingConvention 
{ 
    public void PostProcess(BsonClassMap classMap) 
    { 
     var idMemberMap = classMap.IdMemberMap; 
     if (idMemberMap == null || idMemberMap.IdGenerator != null) 
     { 
      return; 
     } 

     idMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance); 
    } 
} 

दूसरा के लिए एक सम्मेलन जोड़ें। हमारे सम्मेलन रजिस्टर करें। Register विधि को पहली क्वेरी से पहले कहा जाना चाहिए।

var conventionPack = new ConventionPack { new IdGeneratorConvention() }; 
ConventionRegistry.Register("Pack", conventionPack, x => true); 
संबंधित मुद्दे