मान लें कि मेरे पास कुछ संदर्भित वर्गों के साथ एक प्लेलिस्ट क्लास है। प्लेलिस्ट निकाय संग्रह को डेटा प्रसंग आवरण में रखा गया है:

    public new IQueryable<Playlist> Playlist
    {
        get
        {
            return base.Playlist
                .Include("PlaylistStep")
                .Include("PlaylistStepAttachment");
        }
    }

प्रति-वेब-अनुरोध के आधार पर अनुप्रयोग घटकों के बीच संदर्भ साझा किया जाता है। प्लेलिस्ट संस्थाओं के लिए पहली कॉल इस तरह दिखती है:

            var playlist =
            dataContext
                .Playlist
                .Where(x => x.OwnerUserId == ownerId)
                .OrderBy(x => x.Name)
                .Skip((page - 1) * count)
                .Take(count)
                .ToList();

यह उपयुक्त SQL कथन उत्पन्न करता है और जहां तक ​​​​मैं समझता हूं, संदर्भ में कुछ प्लेलिस्ट लोड करता है। फिर उसी वेब अनुरोध में मेरे पास कई कॉल हैं:

            var playlist = dataContext
                .Playlist
                .Where(x => x.PlaylistId == id)
                .FirstOrDefault();

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

क्या कोई मुझे बता सकता है कि मैं कहाँ गलत हूँ, या यह व्यवहार EF के लिए सामान्य है?

0
borovikpe 18 मार्च 2011, 19:37
जांच के बारे में बहुत कुछ पता नहीं है। लेकिन क्या आप जानते हैं कि EF V1 में बहुत सारी समस्याएं थीं और इसलिए हमारे पास EF4 है
 – 
gideon
18 मार्च 2011, 19:58

2 जवाब

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

आप जो व्यवहार देख रहे हैं वह सामान्य है, क्योंकि ObjectQuery<T> हमेशा की गणना करना एक DB क्वेरी करता है।

आप ObjectContext.ObjectStateManager में देखकर स्थानीय रूप से लोड किए गए ऑब्जेक्ट को क्वेरी कर सकते हैं। यह ठीक काम करता है, हालांकि वाक्य रचना कम सहज है।

EF 4.1 नई DbSet<T>.Local प्रॉपर्टी पेश करता है, जो इसे आसान बनाता है

0
Craig Stuntz 18 मार्च 2011, 23:40

ऐसा लगता है कि यह इस मुद्दे की व्याख्या करता है: http://connect.microsoft.com/VisualStudio /फीडबैक/विवरण/511785/कार्यान्वयन-कैशिंग-इन-इकाई-फ्रेमवर्क

वर्तमान में ईएफ बॉक्स के बाहर केवल प्रथम स्तर के कैश का समर्थन करता है। प्रथम स्तर की कैशिंग मूल रूप से क्वेरी परिणामों में संस्थाओं का केवल पहचान समाधान है। सभी क्वेरी अभी भी सर्वर से टकराती हैं और पूर्ण निकाय परिणाम वापस लाती हैं।

1
borovikpe 18 मार्च 2011, 19:57