मैं EntityFramework के साथ अपने डेटाबेस से एक क्रमबद्ध वस्तु के साथ एक http अनुरोध का उत्तर देने का प्रयास कर रहा हूं। इसे प्राप्त करने के लिए मैं निम्नलिखित कार्य करता हूं:

message m = dbContext.messages.FirstOrDefault(e => e.idmessage == id);
return Request.CreateResponse(HttpStatusCode.OK, m);

लेकिन संदेश मॉडल में इस तरह की विशेषता होती है:

public virtual fichero fichero { get; set; }

अगर मैं आलसी लोड को गलत पर सेट करता हूं तो fichero संपत्ति लौटा दी जाती है और सब कुछ ठीक काम करता है। यदि आलसी लोड सत्य पर सेट है, तो मुझे एक अपवाद मिलता है जैसे कि यह आलसी लोड सही अपवाद:

Exception stack trace

मुझे लगता है कि ऐसा इसलिए हो सकता है क्योंकि मैं डेटाबेस से पूरी तरह से लोड होने से पहले धारावाहिक वस्तु को वापस करने का प्रयास करता हूं, लेकिन मैं इसके साथ नोबी हूं इसलिए मुझे यकीन नहीं है।

मैं इसे वापस करने से पहले पूरी तरह से लोड होने तक प्रतीक्षा कैसे कर सकता हूं? क्या किसी प्रकार की सदस्यता या समान है? धन्यवाद।

1
Iñigo 17 जुलाई 2019, 12:52

1 उत्तर

सबसे बढ़िया उत्तर

पूरी तरह से लोड होने तक प्रतीक्षा करें

आलसी लोडिंग का मतलब यह नहीं है कि नेविगेशन गुण (जैसे कि आपकी fichero fichero) पृष्ठभूमि पर लोड हो गए हैं। इसका मतलब है कि वे लोड हो जाते हैं जब संपत्ति का अनुरोध किया जाता है, उदाहरण के लिए जब आप इस तरह कोड लिखते हैं:

var message = dbContext.Messages.FirstOrDefault(some query); // one database hit
var fichero = message.Fichero; // another database hit

जैसे ही आप message.Fichero गेट्टर तक पहुँचते हैं, गतिशील रूप से उत्पन्न प्रॉक्सी वर्ग Fichero को पुनः प्राप्त करने के लिए एक अन्य डेटाबेस क्वेरी निष्पादित करेगा।

ऐसा इसलिए हो सकता है क्योंकि मैं क्रमबद्ध वस्तु को वापस करने का प्रयास करता हूं

बिल्कुल। एमवीसी (या वेब एपीआई, या जो कुछ भी) प्रतिबिंब का उपयोग करके ऑब्जेक्ट को क्रमबद्ध करेगा, और ऐसा करने में, यह गुणों के गेटर्स तक पहुंचता है, एक और डेटाबेस क्वेरी जारी करता है - लेकिन डीबीकॉन्टेक्स्ट पहले ही निपटाया जा चुका है, इसलिए किसी और प्रश्न के लिए अनुपयोगी है।

संभव समाधान:

  • अपने एपीआई (.Include(m => m.Fichero) से जो कुछ भी आप वापस करना चाहते हैं, उसे स्पष्ट रूप से लोड करें
  • आलसी लोडिंग अक्षम करें, इसलिए केवल आपकी "रूट" इकाई लौटा दी जाएगी
  • अपनी संस्थाओं को एक व्यूमॉडल/डीटीओ में मैप करें, जो वैसे भी अनुशंसित दृष्टिकोण है

बाद वाला इस तरह दिखेगा:

public class MessageViewModel
{
    public string Message { get; set; }
    public string FicheroFoo { get; set; }

    // ...
}

var message = dbContext.Messages.FirstOrDefault(some query);

var model = new MessageViewModel
{
    Message = message.Message,
    FicheroFoo = message.Fichero.Foo,
    // ...
};

return Request.CreateResponse(HttpStatusCode.OK, model);
2
CodeCaster 17 जुलाई 2019, 13:01