2010-04-01 19 views
10

से ऑब्जेक्ट रीफ्रेश करें मुझे अपने डेटाबेस में रीफ्रेशिंग ऑब्जेक्ट्स में समस्या हो रही है। मेरे पास दो पीसी और दो एप्लीकेशन हैं।इकाई फ्रेमवर्क - डेटाबेस

पहले पीसी पर, एक ऐसा एप्लिकेशन है जो मेरे डेटाबेस के साथ संचार करता है और मापन तालिका में कुछ डेटा जोड़ता है। मेरे अन्य पीसी पर, एक ऐसा एप्लिकेशन है जो टाइमर के तहत नवीनतम मापन को पुनः प्राप्त करता है, इसलिए इसे मेरे पहले पीसी पर भी एप्लिकेशन द्वारा जोड़े गए मापन को पुनः प्राप्त करना चाहिए।

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

public static Entities myEntities = new Entities(); 

    public static Measurement GetLastMeasurement(int conditionId) 
    { 
     myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements); 

     return (from measurement in myEntities.Measurements 
       where measurement.ConditionId == conditionId 
       select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
    } 

पी.एस.:

यहाँ मेरी विधि है जो डेटा को अद्यतन करना चाहिए एप्लिकेशन में app.config (एक ही डीबी के लिए अलग-अलग खाते) में अलग-अलग कनेक्शन स्ट्रिंग हैं।

+0

तुम मेरे इस सवाल का जवाब यहाँ http://stackoverflow.com/questions/1746941/objectcontext-refresh –

उत्तर

9

यह काम करना चाहिए:

public static Entities myEntities = new Entities(); 

public static Measurement GetLastMeasurement(int conditionId) 
{ 
    myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements); 
    var allMeasurements = myEntities.Measurements.ToList();//retrieves all measurements from database 

    return (from measurement in allMeasurements 
      where measurement.ConditionId == conditionId 
      select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
} 

क्या भावना कैशिंग बनाता है जब आप की दुकान हर बार जब आप इसका उपयोग करना चाहते ताज़ा? आप इसे चुन सकते हैं:

public Measurement GetLastMeasurement(int conditionId) 
{ 
    var entities = new Entities(); 
    return (from measurement in entities.Measurements 
      where measurement.ConditionId == conditionId 
      select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
} 

यह प्रत्येक कॉल के साथ डेटाबेस में भी दिखता है, लेकिन बहुत कम संचालन करता है।

+0

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

+0

@ नीबो: दूसरा समाधान काम नहीं करता है? यह वापस क्या करता है? – LukLed

+0

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

8

ईएफ 4.1 के रूप में आप अपनी संस्थाओं पर AsNoTracking() विधि का उपयोग कर सकते हैं।

return myEntities.Measurements.AsNoTracking(); 

ध्यान दें कि AsNoTracking() ट्रैकिंग के लिए आपकी संदर्भ के लिए संस्थाओं नहीं जोड़ना होगा, लेकिन केवल उन्हें अपने डेटा की दुकान से ताजा लौट आते हैं।

अधिक जानकारी के लिए देख http://blogs.msdn.com/b/adonet/archive/2011/02/05/using-dbcontext-in-ef-feature-ctp5-part-11-load-and-asnotracking.aspx

3

एक और संभावना MergeOption उपयोग करने के लिए कैसे आप संदर्भ में वस्तुओं प्रबंधित करना चाहते हैं तय करने के लिए है। उदाहरण के लिए MergeOption.OverwriteChanges डेटा स्रोत से मूल्यों के साथ ऑब्जेक्ट संदर्भ को ओवरराइट करेगा।

अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx

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