मान लें कि मेरे पास कुछ संदर्भित वर्गों के साथ एक प्लेलिस्ट क्लास है। प्लेलिस्ट निकाय संग्रह को डेटा प्रसंग आवरण में रखा गया है:
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 के लिए सामान्य है?
2 जवाब
आप जो व्यवहार देख रहे हैं वह सामान्य है, क्योंकि ObjectQuery<T>
हमेशा की गणना करना एक DB क्वेरी करता है।
आप ObjectContext.ObjectStateManager
में देखकर स्थानीय रूप से लोड किए गए ऑब्जेक्ट को क्वेरी कर सकते हैं। यह ठीक काम करता है, हालांकि वाक्य रचना कम सहज है।
EF 4.1 नई DbSet<T>.Local
प्रॉपर्टी पेश करता है, जो इसे आसान बनाता है।
ऐसा लगता है कि यह इस मुद्दे की व्याख्या करता है: http://connect.microsoft.com/VisualStudio /फीडबैक/विवरण/511785/कार्यान्वयन-कैशिंग-इन-इकाई-फ्रेमवर्क
वर्तमान में ईएफ बॉक्स के बाहर केवल प्रथम स्तर के कैश का समर्थन करता है। प्रथम स्तर की कैशिंग मूल रूप से क्वेरी परिणामों में संस्थाओं का केवल पहचान समाधान है। सभी क्वेरी अभी भी सर्वर से टकराती हैं और पूर्ण निकाय परिणाम वापस लाती हैं।
संबंधित सवाल
नए सवाल
entity-framework
एंटिटी फ्रेमवर्क .NET के लिए एक LINQ- आधारित ऑब्जेक्ट-डेटाबेस मैपर है। यह कई डेटाबेस के लिए परिवर्तन ट्रैकिंग, अपडेट और स्कीमा माइग्रेशन का समर्थन करता है। कृपया लागू होने पर एक संस्करण-विशिष्ट टैग जोड़ें।