इकाई फ्रेमवर्क संदर्भ को ताज़ा करें?


101

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

जवाबों:


92

अपने संदर्भ में संस्थाओं को ताज़ा करने का सबसे अच्छा तरीका है कि आप अपने संदर्भ को समाप्त करें और एक नया बनाएं।

यदि आपको वास्तव में कुछ इकाई को ताज़ा करने की आवश्यकता है और आप DbContext वर्ग के साथ कोड प्रथम दृष्टिकोण का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं

    public static void ReloadEntity<TEntity>(
        this DbContext context, 
        TEntity entity)
        where TEntity : class
    {
        context.Entry(entity).Reload();
    }

संग्रह नेविगेशन गुणों को पुनः लोड करने के लिए, आप उपयोग कर सकते हैं

    public static void ReloadNavigationProperty<TEntity, TElement>(
        this DbContext context, 
        TEntity entity, 
        Expression<Func<TEntity, ICollection<TElement>>> navigationProperty)
        where TEntity : class
        where TElement : class
    {
        context.Entry(entity).Collection<TElement>(navigationProperty).Query();
    }

संदर्भ: https://msdn.microsoft.com ।पुनः लोड करें


3
मुझे यह बाल नेविगेशन संपत्तियों को फिर से लोड करने के लिए काम करने के लिए नहीं मिल सकता है।
पॉल

@ आपके context.ReloadNavigationProperty(parent, p => p.Children);पास अगर आपके पास हैclass Parent { ICollection<Child> Children; }
जिनजिनोव

ईएफ कोर में आप क्वेरी () लोड का उपयोग कर सकते हैं () उदाहरण के लिएcontext.Entry(order).Collection(o => o.NavigationProperty).Query().Load();
Rubenisme

मुझे समझ नहीं आ रहा है कि इस समाधान को इतना वोट क्यों दिया जाता है। संदर्भ.इंट्री (एंटिटी)। कॉलेक्शन <टीलीमेंट> (नेविगेशनप्रॉपर्टी) .Query () बच्चे के संग्रह को फिर से लोड नहीं करता है। यह केवल आपको संग्रह प्राप्त करने के लिए उपयोग की जाने वाली क्वेरी का प्रतिनिधित्व करने वाला एक Iqueryable देता है। यह सचमुच कुछ नहीं करता है।
स्टेट जूल

72
yourContext.Entry(yourEntity).Reload();

3
आसान समाधान के लिए धन्यवाद। मुझे यह विस्तार करने की आवश्यकता नहीं दिखती है जैसे एक विस्तार विधि में RX_DID_RX ने किया था
थॉमस

यह मेरे लिए एक जीवनसाथी था। धन्यवाद!
केविन

19
ध्यान दें कि यह संग्रह नेविगेशन गुणों को पुनः लोड नहीं करता है, केवल इकाई प्रविष्टि है।
जेम्स विल्किंस

28

यदि आप विशिष्ट संस्थाओं को पुनः लोड करना चाहते हैं, तो DbContextApi के साथ, RX_DID_RX ने आपको पहले ही जवाब दे दिया है।

यदि आप अपने द्वारा लोड की गई सभी संस्थाओं को पुनः लोड / रीफ्रेश करना चाहते हैं:

यदि आप इकाई फ्रेमवर्क 4.1+ (EF5, या EF 6 शायद), DbContext API का उपयोग कर रहे हैं:

public void RefreshAll()
{
     foreach (var entity in ctx.ChangeTracker.Entries())
     {
           entity.Reload();
     }
}

यदि आप शस्त्रागार 4 का उपयोग कर रहे हैं (ObjectContext API):

public void RefreshAll()
{
     // Get all objects in statemanager with entityKey
     // (context.Refresh will throw an exception otherwise)
     var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted
                                               | EntityState.Modified
                                               | EntityState.Unchanged)
                                      where entry.EntityKey != null
                                      select entry.Entity);

     context.Refresh(RefreshMode.StoreWins, refreshableObjects);
}

वैसे भी सर्वोत्तम सलाह है, "अल्पकालिक संदर्भ" का उपयोग करने का प्रयास करें और आप इस तरह की समस्याओं से बचेंगे।

मैंने इस मामले पर कुछ लेख लिखे:

https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/


अच्छा है!! मेरा दिन बचाया!
रादु डी

15

रीफ्रेश विधि का उपयोग करें :

context.Refresh(RefreshMode.StoreWins, yourEntity);

या वैकल्पिक रूप से अपने वर्तमान संदर्भ का निपटान करें और एक नया बनाएं।


@JMK वास्तव में यहाँ क्या काम नहीं करता है? यह मेरे लिए ठीक काम करने लगता है (EF 6.1.1)।
सेबेस्टियन क्रिम्समेंस्की

@SebastianKrysmanski मैंने लगभग एक साल पहले टिप्पणी की थी, शायद यह तय हो गया है?
JMK

5
मुझे लगता है कि यह केवल ऑब्जेक्टकॉन्टेक्ट के लिए काम करता है, लेकिन डीबीकॉन्टेक्स नहीं। उनके बीच एक वार्तालाप आवश्यक है
बैटमेसी

3
@ बटमासी जिसे आसानी से किया जा सकता है((IObjectContextAdapter)dbContext).ObjectContext
डैनियल जेड

3
जिसे इतना कम अधूरा नहीं कहा गया था।
user441521

6

संदर्भ। रेलीड () एमवीसी 4, ईएफ 5 में मेरे लिए काम नहीं कर रहा था इसलिए मैंने ऐसा किया।

context.Entry(entity).State = EntityState.Detached;
entity = context.Find(entity.ID);

और इसके काम ठीक है।


1

ईएफ 6

मेरे परिदृश्य में, एंटिटी फ्रेमवर्क नए अपडेट किए गए डेटा को नहीं उठा रहा था। कारण यह हो सकता है कि डेटा को इसके दायरे से बाहर अपडेट किया गया था। मेरे अंक को हल करने के बाद डेटा ताज़ा करना।

private void RefreshData(DBEntity entity)
{
    if (entity == null) return;

    ((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entity);
}

private void RefreshData(List<DBEntity> entities)
{
    if (entities == null || entities.Count == 0) return;

    ((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entities);
}

1
मैं EF6 के साथ हूं। यह एक से बेहतर क्यों है _context.Entry(entity).Reload();?
सेसाबा टोथ

जहाँ तक मुझे याद है, .Reload()EF6 में उपलब्ध नहीं है। @ कुसबतोठ
महबूबुर रहमान

0

Reload के साथ रीफ़्रेशिंग DB संदर्भ को प्रदर्शन हार के कारण अनुशंसित नहीं किया जाता है। यह काफी अच्छा है और प्रत्येक ऑपरेशन को निष्पादित करने से पहले dbcontext के एक नए उदाहरण को इनिशियलाइज़ करने के लिए सबसे अच्छा अभ्यास है। यह आपको प्रत्येक ऑपरेशन के लिए ताज़ा संदर्भ प्रदान करता है।

using (YourContext ctx = new YourContext())
{
   //Your operations
}

6
यार .. अपने संदर्भ को हर बार डंप करने से वह सामान भी ताज़ा हो जाएगा जिसे आप ताज़ा नहीं करना चाहते हैं, जो वास्तव में प्रदर्शन समस्याओं को जन्म देगा।
लकीलकी

3
यह एक भयानक विचार है क्योंकि यह यूनिट परीक्षणों को लिखने की क्षमता को प्रभावित करता है। यदि आपका कोड बंद हो जाता है और एक नया संदर्भ आता है, तो इकाई परीक्षण के दौरान वह कैसे काम करेगा?
विजेता

5
यह मेरे लिए और दूसरों के लिए उपयोगी होगा यदि आप आलोचना करने के बजाय कुछ नमूने दिखाते हैं।
अोग

छोटी वेबसाइटों के लिए यह ठीक है।
एलिकुली

-1

वास्तव में मैं पूरी इकाई को हटाने, और आपके दृष्टिकोण के आधार पर इसे फिर से बनाने का सुझाव देता हूं


-7

मैं कुछ भी नहीं पर अपना खुद का सिर चोट लगी है! जवाब बहुत आसान था- मैं बस मूल बातें करने के लिए वापस चला गया ...

some_Entities   e2 = new some_Entities(); //your entity.

अपडेट / डिलीट करने के बाद नीचे इस लाइन को जोड़ें - आप अपनी इकाई को पुनः लोड कर रहे हैं-कोई फैंसी सिस्टम पद्धति नहीं।

e2 = new some_Entities(); //reset.

3
वह "काम" करेगा - यह सिर्फ एक भयानक विचार है और इसके अन्य परिणाम होंगे
एडम हे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.