2015-02-06 5 views
5

संपादित -2: अनुसंधान के घंटे और गूगल बैंगनी मोड़ पर लगभग हर OData संबंधित लिंक के बाद, मुझे पता चला है कि 'गहरे आवेषण' (link) की अवधारणा में मौजूद है ओडाटा विनिर्देश। तो आखिरकार, जो भी मैं कर रहा हूं, लिंक के बिना भी काम करना चाहिए। क्या किसी को यह पता है कि माइक्रोसॉफ्ट ओडाटा क्लाइंट पर इसे कैसे सक्षम किया जाए? क्या वहां कोई अन्य ओडाटा ग्राहक हैं जो उस अवधारणा का समर्थन करते हैं?सम्मिलित करना संस्थाओं

संपादित करें: शायद यह गलत दृष्टिकोण है, इसलिए कृपया मुझे बताएं कि मैं इसे पूरी तरह गलत कर रहा हूं। बचाने में सक्षम नहीं है वास्तव में हमारी प्रगति को अवरुद्ध कर रहा है!

मुझे ओडाटा v3 के साथ कोई समस्या है। मेरे पास कक्षा Associate है जिसमें एक आवश्यक Address है। जब मैं एक नया एसोसिएट पोस्ट करने का प्रयास करता हूं, तो यह Address संपत्ति शून्य के कारण विफल रहता है (EF6 विदेशी कुंजी उल्लंघन के साथ DbUpdateException फेंकता है)।

public class Associate 
{ 
    public int Id { get; set; } 

    [Required, StringLength(100)] 
    public string Name { get; set; } 

    [Required, StringLength(50)] 
    public string Role { get; set; } 

    public bool IsMailReceiver { get; set; } 
    public bool IsLegalRepresentative { get; set; } 

    [ForeignKey("AddressId")] 
    public virtual Address Address { get; set; } 
    public int AddressId { get; set; } 
} 

मैं माइक्रोसॉफ्ट OData ग्राहक का उपयोग, और निम्नलिखित तरीके से सहयोगी जोड़ने का प्रयास:: मेरी Associate वर्ग इस तरह दिखता है

var associate = new Associate { /* ... */ }; 
context.AddObject("Associates", associate); 
context.AddObject("Addresses", associate.Address); 

/* UI fills associate data */ 

context.SetLink(associate, "Address", associate.Address); 
context.UpdateObject(associate); 
context.UpdateObject(associate.Address); 

/* at this point the associate has the address set! */ 

context.SaveChanges(); // << Exception 

सर्वर पर, नियंत्रक में, एसोसिएट आता है हालांकि, विदेशी कुंजी के बिना। जब मैं फ़िडलर साथ पोस्ट अनुरोध का निरीक्षण किया, मैं देख रहा हूँ क्यों:

{ 
    "odata.type" : "xxx.Data.Entities.Associate", 
    "AddressId" : 0, 
    "Id" : 0, 
    "IsLegalRepresentative" : false, 
    "IsMailReceiver" : false, 
    "Name" : "John Doe", 
    "Role" : "Father" 
} 

पता नहीं फैलता है, भले ही ग्राहक पर उत्पन्न वर्ग एक Address संपत्ति है।

मैं इस समस्या को कैसे हल कर सकता हूं?

+0

आप इकाई की रूपरेखा मॉडल सही ढंग से करने के लिए AddressId संपत्ति टाई करने के लिए स्थापित किया है ahvbe है पता इकाई? अक्सर मैं ऐसा करना भूल जाता हूं इसलिए मेरी संपत्ति विदेशी कुंजी से सही ढंग से लिंक नहीं होती है। –

+0

@TheSenator पता भी नया है, यही कारण है कि मुझे सर्वर की तरफ भौतिक वस्तु की आवश्यकता है, इसलिए ईएफ बाकी का प्रबंधन कर सकता है (जैसा कि यह बहुत अच्छा करता है)। – LueTm

+0

आप ग्राहक से JSON POST अनुरोध कैसे भेजते हैं? अधिक सटीक, आप ग्राहक पक्ष पर एसोसिएट/पता कैसे क्रमबद्ध करते हैं? – nXu

उत्तर

0

इस के लिए कोई समाधान नहीं है। मैं अपने स्वयं के संदर्भ को परिवर्तन सेट की धारणा के साथ रोल करूंगा जो वेब-एपीआई के साथ काम करता है। जब मैं करूँगा, तो मैं इसे गीथूब पर रखूंगा।

0

मूल रूप से जब आप वस्तु

var associate = new Associate { /* ... */ }; 

यह डेटाबेस में सम्मिलित नहीं किया गया है पैदा करते हैं। यह स्मृति में बनाया गया है। जब आप

context.SaveChanges(); 

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

यदि यह नहीं किया जाता है तो आपका स्थानीय संदर्भ और डेटाबेस संदर्भ अब मेल नहीं खाता है। यदि आप उस ऑब्जेक्ट का उपयोग किसी अन्य चीज़ के संदर्भ में करते हैं तो यह असफल हो जाएगा।

मुझे लगता है कुछ इस तरह काम करेगा:

Address address = new Address{ City = "Tallinn" /*etc*/}; 
context.SaveChanges(); 
//At this point Address will be in database context and has Id 
associate = new Associate { 
    name = "Margus", 
    role = "Admin", 
    receiver = true, 
    representative = true, 
    AddressId = address.id 
}; 
context.SaveChanges(); 
+0

आप एक मैनुअल है, तो जरूरत है: https://msdn.microsoft.com/en-us/data/jj713564.aspx – Margus

+0

तो तुम कह रहे हो मैं पहली बार सभी नए संस्थाओं पोस्ट करने के लिए है? यह बहुत जटिल होगा। मुझे यह पता लगाने की आवश्यकता होगी कि कौन सी नई संस्थाएं अन्य नए लोगों पर निर्भर करती हैं, फिर उन्हें उस क्रम में सर्वर पर पोस्ट करें, फिर आईडी वापस पाएं, उन्हें असाइन करें, फिर से सभी ऑब्जेक्ट अपडेट करें और फिर ओडाटा संदर्भ पर परिवर्तनों को सहेजें कॉल करें। क्या यह वास्तव में यह कैसे किया जाता है? ऐसा लगता है कि मैं ओडीएटी संदर्भ को इस तरह से कोड कर रहा हूं:/ – LueTm

+0

@LueTm नहीं, लेकिन अधिकतर आपको कोई समस्या है और यह संभावनाओं को खत्म करते समय यह पता लगाने में मदद करेगा। – Margus

1

मुझे भी इसके बारे में कोई जानकारी नहीं मिली - यह वास्तव में ओडाटा में एक समस्या की तरह लगता है। यहां बताया गया है कि मैं इसे कैसे काम करने में कामयाब रहा।

विदेशी कुंजी परिभाषित स्पष्ट

class Student { 
     public int TeacherId { get; set; } 

     [Required, ForeignKey("TeacherId")] 
     public virtual Teacher Teacher { get; set; } 
} 

जब डालने प्रदर्शन, संबंधित रिकॉर्ड लाने और मॉडल राज्य को ठीक: तब से तो

public IHttpActionResult Post(Student student) 
    { 
     student.Teacher = this.db.Teacher.FirstOrDefault(i => i.TeacherId == student.TeacherId); 
     if (student.Teacher != null) 
     { 
      this.ModelState.Remove("student.Teacher"); 
     } 

     if (!this.ModelState.IsValid) 
     { 
      return this.BadRequest(this.ModelState); 
     } 
    } 

एक छात्र पोस्ट करने के लिए, आप पर ध्यान न दें शिक्षक क्षेत्र और शिक्षक आईडी के साथ बस पोस्ट करें।

मैं OData ग्राहक के साथ इस परीक्षण नहीं किया है, लेकिन मैं क्यों यह काम नहीं होगा सोच भी नहीं सकते। आपको ऑब्जेक्ट की बजाय आईडी फ़ील्ड का उपयोग करना होगा।

0

एक ही रास्ता addlink और setlink काम करता है, तो विदेशी कुंजी नल है और आप एक postput समारोह कॉल बनाने के लिए बनाने के लिंक को देखने के here

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