2013-01-03 18 views
5

में किसी आईडी का मान बदलना हमारे पास संगठन नाम की एक इकाई है जिसे हम अनन्यकोनस्ट्रेन-बंडल का उपयोग करते हैं। हमारे पास NetName नाम की एक संपत्ति है जो एक अनोखा कॉन्स्ट्रेन और स्वचालित रूप से जेनरेट की गई आईडी है।RavenDB

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

हम एक आईडी के रूप में यह प्रयोग करने से पहले थोड़ा हमारे NETNAME को साफ करने की जरूरत है ताकि हम एक नए अस्थायी-संपत्ति TempUniqueNetName कहा जाता है कि अब के मूल्य रखती बनाया:

"organizations/"+ CleanupId(this.NetName) 

तो अब हम करने के लिए तैयार कर रहे हैं बस उस मूल्य को हमारे आईडी पर ले जाएं। लेकिन हम इसे काम नहीं कर सकते हैं। हमारी समस्या यह है कि नीचे पैचआरक्वेट के साथ हम डेटाबेस में आईडी नामक एक नई संपत्ति के साथ समाप्त होते हैं लेकिन एक्टुअल आईडी में अभी भी वही मान है (स्क्रीनशॉट देखें)। क्या आईडी के मान को बदलने के लिए कोई बेहतर (सही) तरीका है?

निकाय:

class Organization { 
    public string Id { get; set; } 

    [UniqueConstraint] 
    public string NetName { get; set; } 

    public string TempUniqueNetName{ get; set; } 
} 

हम इस तरह कुछ करना चाहता हूँ:

_documentStore.DatabaseCommands.UpdateByIndex(typeof(Organizations).Name, 
      new IndexQuery(), 
      new[] 
        { 
         new PatchRequest() 
          { 
           Type = PatchCommandType.Rename, 
           Name = "TempUniqueNetName", 
           Value = new RavenJValue("Id") 
          } 
        }); 

Value has not changed

उत्तर

5

मुझे नहीं लगता कि आप पैचिंग के माध्यम से दस्तावेज़ कुंजी को बदल सकते हैं है। यह वास्तव में दस्तावेज़ या मेटाडेटा के साथ संग्रहीत नहीं है - यह आपको लोड पर @id मेटाडेटा में कॉपी किया गया है ताकि आपको यह भ्रम मिल सके कि यह वहां है, और रावेन क्लाइंट दस्तावेज़ में अपनी पहचान संपत्ति में फिर से कॉपी करता है। लेकिन वास्तव में, यह अंतर्निहित एसेन्ट दस्तावेज़ स्टोर में एक अलग मूल्य है। रावेन को यह जानना होगा कि इसे कैसे संभालें और इसे आपके लिए नकली कैसे करें।

आप पुराने आईडी से दस्तावेज़ को मैन्युअल रूप से कॉपी कर सकते हैं और पुराने को हटा सकते हैं, लेकिन यह समय लेने वाला हो सकता है।

अभी दस्तावेज़ दस्तावेज़ का नाम बदलने का कोई अच्छा जवाब नहीं है। वास्तव में एक दस्तावेज़ को रीक करने के लिए डेटाबेस डेटाबेस होना चाहिए, और पैचिंग के दौरान पैच कॉमांड टाइप को रीकी करने के लिए अलग होना चाहिए। शायद यह भविष्य में रेवेन में जोड़ा जाएगा।

+0

प्रकाशित किया गया था यहाँ का अनुरोध: http://issues.hibernatingrhinos.com/issue/RavenDB-801 –

+0

ठीक है, आपके उत्तर के लिए धन्यवाद। हम शायद आपके सुझाव का उपयोग करेंगे और दस्तावेज़ की प्रतिलिपि बनाएँ। यह एक बार बात है इसलिए मुझे कोई फर्क नहीं पड़ता कि इसमें कुछ समय लगेगा। उम्मीद है कि अगली बार हमें इसकी आवश्यकता होगी :) –

+1

एफवाईआई: द रावेनडीबी देव ने जवाब दिया कि वे इस सुविधा को जोड़ने वाले नहीं हैं और इसके बजाय "इसे उपयोगकर्ता द्वारा हटाए जाने की लेनदेन संबंधी जोड़ी/आसानी से लागू किया जा सकता है । " –

1

आप मेरे जीथब रेपो में आईडी अपडेट करने के लिए पुट-डिलीट उपयोग की नकल की जांच कर सकते हैं। वह कुछ इस तरह दिखना चाहिए:

store.DatabaseCommands.Put(updatedKey, null, document.DataAsJson, newMetadata); 
store.DatabaseCommands.Delete(oldKey, null); 

https://github.com/Sevsoad/SagaUpdater/

इसके अलावा यहाँ कुछ रेवेन प्रलेखन है:

https://ravendb.net/docs/article-page/3.0/csharp/client-api/commands/documents/put