2012-09-26 13 views
7

मैं डब्ल्यूसीएफ डेटा सेवाओं (ओडाटा वी 3 एप्लिकेशन/जेसन, ओडाटा = वर्बोज़ पेलोड प्रारूप का उपयोग कर ओडीटा सेवा का उपयोग करके एक साधारण परिदृश्य था जो मैंने सोचा था, इसे लागू करने की कोशिश कर रहा हूं। मैं JSON लाइट प्रारूप का उपयोग कर सकता हूं भविष्य)। बुनियादी परिदृश्य इस प्रकार है:मैं ओडाटा इकाई को कैसे अपडेट करूं और एक अनुरोध में अपनी नेविगेशन गुणों को संशोधित कैसे करूं?

class Person 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual PersonCategory Category { get; set; } 
} 

class PersonCategory 
{ 
    public int ID { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<Person> People { get; set; } 
} 

अब, मैं एक व्यक्ति के लिए एक सरल संपादित करें पृष्ठ बनाना चाहते हैं:

मैं दो संस्थाओं की है। इस संपादन पृष्ठ में नाम के लिए इनपुट हो सकता है, और व्यक्ति की श्रेणी के लिए इनपुट या ड्रॉप-डाउन हो सकता है।

तो, परिदृश्य जाता है:

  1. कोड व्यक्ति $ का उपयोग कर श्रेणी के लिए विस्तार डाउनलोड: प्राप्त /api.svc/People(1)?$expand=Category
  2. उपयोगकर्ता संपादन दोनों व्यक्ति के नाम संपत्ति और उनकी श्रेणी।
  3. पृष्ठ के लिए कोड उस व्यक्ति का नाम और श्रेणी गुण अपडेट करने का एकमात्र अनुरोध करता है।

यहां कुंजी "एक ही अनुरोध" में है। यह वह हिस्सा है जिसके लिए मुझे दस्तावेज़ ढूंढने में परेशानी हो रही है। मैंने उदाहरण देखे हैं जहां उन्होंने उपरोक्त संख्या 3 को दो अनुरोधों में विभाजित किया है। कुछ इस तरह (मैं सही प्रारूप याद नहीं है - मैं भी यकीन नहीं है अगर आप PUT करने से पहले श्रेणी लिंक हटाने के लिए होगा):

PATCH /api.svc/People(1) with content: {"Name": "new name" } 
PUT /api.svc/People(1)/$links/Category with content: { "url": "/api.svc/Categories(2)" } 

लेकिन, मैं भी यह सुना है ने कहा, लेकिन प्रदर्शित नहीं किया है, कि व्यक्ति अद्यतन में अन्य परिवर्तनों के साथ निर्दिष्ट श्रेणी नेविगेशन संपत्ति में बदलाव के साथ एक ही अनुरोध के रूप में इस अद्यतन को लागू करना संभव है। क्या कोई मुझे उदाहरण दे सकता है कि यह कैसे किया जा सकता है? साथ ही, क्या आप मुझे दिखा सकते हैं कि यह कई से अधिक नेविगेशन प्रॉपर्टी के साथ कैसे किया जाएगा, जैसा कि मैंने ऊपर वर्णित एक से अधिक के विरोध में किया है।

और अंत में, मैं वर्तमान में वर्बोज़ JSON प्रारूप, V3 का उपयोग कर रहा हूं। यदि मैं इसके बजाय नए JSON प्रकाश प्रारूप का उपयोग करता हूं तो ऊपर दिए गए प्रश्नों के आपके उत्तर अलग होंगे? यदि हां, तो कैसे?

+0

आप बैच अनुरोध भेज सकते हैं - यह एक ही अनुरोध होगा जिसमें दोनों ऑपरेशन होंगे। – Pawel

+0

क्या बैच अनुरोध के अलावा ऐसा करने का कोई और तरीका नहीं है? इससे क्लाइंट पक्ष पर राउंड-ट्रिपिंग कोड में कुछ अतिरिक्त जटिलता शामिल होगी जिसे मैं टालना पसंद करूंगा। आदर्श रूप में मैं बस अपने पैच/एपीआई/गतिविधि (1) अनुरोध को कुछ ऐसा करने के लिए प्रारूपित करना चाहता हूं: {"श्रेणी": {"__deferred": {"uri": "/api.svc/Categories(2)"} }} हालांकि यह काम करने के लिए प्रतीत नहीं होता है। मुझे 204 प्रतिक्रिया मिलती है, लेकिन संपत्ति सर्वर की तरफ अपरिवर्तित बनी हुई है। –

+0

इसलिए गहरे अपडेट (जो आप यहां चाहते हैं) कहा जाता है, वे डब्ल्यूसीएफ डाटा सर्विसेज द्वारा समर्थित नहीं हैं। वास्तव में ओडाटा भी वास्तव में इसे परिभाषित नहीं करता है। यह कुछ मामलों में इसका अर्थ क्या है इसके बजाय यह जटिल हो सकता है। मुझे डर है बैच इस के लिए एकमात्र समाधान है। गहरे आवेषण समर्थित हैं (लेकिन फिर से केवल प्रविष्टियां, मौजूदा कुछ भी संशोधित नहीं) हालांकि। –

उत्तर

4

प्रतीक की टिप्पणी जवाब (! प्रतीक यदि आप एक जवाब के रूप में इस repost करना चाहते हैं, मैं इसे के रूप में ऐसे में चिह्नित कर देंगे - धन्यवाद) था:

प्रश्न: आप श्रेणी अपडेट करना चाहते हैं उदाहरण या आप श्रेणी उदाहरण के कुछ गुणों को अपडेट करना चाहते हैं। बैच के अलावा बाद में करने का कोई तरीका नहीं है। पूर्व के लिए, आप कुछ ऐसा कर सकते हैं: {"नाम": "नया नाम", "श्रेणी": {"__metadata": {"uri": "/api.svc/Categories(2)"}}}। उम्मीद है की यह मदद करेगा। - प्रतीक

+0

हम्म यह मेरे लिए अपडेट के साथ काम नहीं करता है – rethenhouser2

+0

जब मैं लिंक मेटाडाटा के लिए पूर्ण यूआरएल \ uri का उपयोग करता हूं तो हम्म काम करता है, ठीक है। – rethenhouser2

4

मैं दो तरीकों इनलाइन नेविगेशन गुण का प्रतिनिधित्व करने के लिए मिला:

application/json;odata=verbose - { "Name": "new name", "Category": { "__metadata": { "uri": "Categories(2)" }}}

application/json - { "Name": "new name", "[email protected]": "Categories(2)" }

+0

आपका पहला उदाहरण ओडाटा 3.0 spec है। आपका दूसरा ओडाटा 4.0 है – JDB

0

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

public class Person 
{ 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
    public int Age {get;set;} 
} 

मान लें कि आपको लगता है कि पहले नाम में एक टाइपो, झोन है और यह जॉन होना चाहिए। आप पहले नाम को संपादित कर सकते हैं और इसे भेज सकते हैं। तो आपके पास निम्न ऑब्जेक्ट मॉडल है। आप दोनों में से 1 तरीकों से प्राप्त कर सकते हैं:

  • दो पैरामीटर है और सिर्फ दो गुणों के साथ एक सामान्य मॉडल वस्तु बनाने BodyStyle = WebMessageBodyStyle.Wrapped
  • सेट: संपत्ति एक प्रकार टी की है और संपत्ति 2 एक सूची है।

तो आप इस json ऊपर भेजना होगा: सर्वर साइड पर अब

[{ FirstName = 'John' }, ['FirstName']] 

, आप आप क्या करने की जरूरत कर सकते हैं।

यदि आप बदली गई संपत्तियां नहीं भेजना चाहते हैं, तो आप किसी भी संपत्ति को चुनकर बदले गए गुणों का अनुमान लगा सकते हैं जिसका मूल्य डिफ़ॉल्ट संपत्ति नहीं है।

{FirstName = 'जॉन'}

तो फिर तुम को देखने के लिए गुण क्या बदल गया है कुछ तरीकों का उपयोग कर सकते हैं:

इकाई प्रति
  • कस्टम कोड सुनिश्चित करने के लिए कि प्रत्येक संपत्ति डिफ़ॉल्ट मान नहीं है और इसे सेट करें। प्रति इकाई कोड का एक टुकड़ा की आवश्यकता है।
  • यह सुनिश्चित करने के लिए प्रतिबिंब कि प्रत्येक संपत्ति डिफ़ॉल्ट मान नहीं है। सभी इकाइयों के लिए 1 वर्ग की आवश्यकता है। मैंने यहां 2014 में एंटिटी फ्रेमवर्क में यह किया था: http://www.rhyous.com/2014/12/01/entityupdater-generic-helper-for-entity-framework/
संबंधित मुद्दे