2012-12-04 1011 views
13

मैं समझता हूं कि ईएफ 5 स्वचालित रूप से प्रश्नों को कैश करेगा, लेकिन क्या यह प्रति संदर्भ या समग्र रूप से करता है? हम एमवीसी का उपयोग कर रहे हैं और dbcontext का निपटान करने के लिए कॉल का उपयोग कर ब्लॉक में लपेट रहे हैं। उदाहरण के लिए:इकाई फ्रेमवर्क के साथ कैश की गई क्वेरी 5

public class Employee 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    public int ID {get; set;} 
} 

public class EmployeeQueryByFirstName : IQueryObject<Employee> 
{ 
    private string _firstName; 

    public void Set(string FirstName) 
    { 
     _firstName = FirstName; 
    } 

    public Expression<Func<Employee,bool>> AsExpression() 
    { 
     return (e=>e.FirstName == this._firstName); 
    } 
} 

public class RepoExcerpt 
{ 
    public TEntity Find<TEntity>(IQueryObject<TEntity> queryObject) 
     where TEntity : class 
    { 
     using (var conn = ServiceLocator.IOC.Resolve<IDbContext>()) 
     { 
      var query = (from q in conn.Set<TEntity>() 
         select q); 
      query = query.Where(queryObject.AsExpression()); 
      return query.FirstOrDefault(); 
     } 
    } 
} 

अगली बार हम भंडार पर Find फोन, 5 इस क्वेरी का संचित संस्करण है एफई होगा, या यह चला जाएगा, क्योंकि हम एक नई dbcontext हो रही होगी? और अगर मुझे कैश किए गए प्रश्न चाहिए, तो क्या मुझे इसे संभालने की ज़रूरत होगी?

उत्तर

6

प्रश्नों को समग्र रूप से कैश किया गया है ताकि आप प्रत्येक अनुरोध के लिए सुरक्षित रूप से डीबीकॉन्टेक्स्ट उदाहरण बना सकें और निपट सकें। वैसे भी यह मेरा पसंदीदा दृष्टिकोण है।
माइक्रोसॉफ्ट दस्तावेज here पाया जा सकता है - अनुभाग 3.2 क्वेरी प्लान कैशिंग देखें।

3

माइक्रोसॉफ्ट से:

डिफ़ॉल्ट रूप से, क्वेरी योजना कैशिंग इकाई एसक्यूएल प्रश्नों, है कि क्या एक EntityCommand के माध्यम से या एक ObjectQuery के माध्यम से निष्पादित करने के लिए सक्षम है। यह भी डिफ़ॉल्ट रूप से LINQ के लिए संस्थाओं प्रश्नों का इकाई फ्रेमवर्क में .NET 4.5 पर इकाई में सक्षम किया गया है, और फ्रेमवर्क 6

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

+0

क्या इंजन को अभी भी यह सुनिश्चित करने के लिए अभिव्यक्ति को पार करने की आवश्यकता है कि यह वही प्रश्न है? –

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

  • कोई संबंधित समस्या नहीं^_^