डेटाबेस से हमेशा अपडेट डेटा प्राप्त करने के लिए एंटिटी फ्रेमवर्क को कैसे मजबूर किया जाए?


86

मैं बैच अपडेट करने के लिए EntityFramework.Extended लाइब्रेरी का उपयोग कर रहा हूं । एकमात्र समस्या ईएफ पुस्तकालय द्वारा किए गए बैच अपडेट का ट्रैक नहीं रखता है। इसलिए जब मैं DbContextफिर से क्वेरी करता हूं तो यह अपडेटेड संस्थाओं को वापस नहीं करता है।

मैंने पाया कि AsNoTracking()क्वेरी करते समय विधि का उपयोग करना ट्रैकिंग को अक्षम करता है और डेटाबेस से ताज़ा डेटा प्राप्त करता है। हालाँकि, चूंकि EF के साथ संबंधित संस्थाओं पर नज़र नहीं रखता है AsNoTracking(), मैं queried डेटा पर कोई भी अपडेट करने में सक्षम नहीं हूं।

क्या परिवर्तनों को ट्रैक करते समय नवीनतम डेटा प्राप्त करने के लिए ईएफ को मजबूर करने का कोई तरीका है?


2
29k विचार और इस पर केवल 19 upvotes ... ठीक है, मैंने वैसे भी मेरा साथ दिया
jleach

जवाबों:


148

कृपया एकल इकाई को ताज़ा करने के लिए इसे आज़माएँ:

Context.Entry<T>(entity).Reload()

संपादित करें: संस्थाओं के संग्रह के लिए ताजा डेटा प्राप्त करने के DbContextलिए प्रत्येक अनुरोध के बाद उदाहरण को निपटाने की कोशिश करना लायक है ।


धन्यवाद! क्या एक के बजाय संस्थाओं के संग्रह को फिर से लोड करने का कोई तरीका है? अधिमानतः संपूर्ण DbSet
Saravana

क्या इस जवाब पर विचार करने के लिए आपको कुछ और चाहिए?
प्लैटयलर

1
हां, यह अभी भी नहीं दिखाता है कि संस्थाओं के संग्रह को कैसे पुनः लोड किया जाए।
Saravana

1
क्या आपने अपने dbcontext को निपटाने और नया बनाने की कोशिश की है?
प्लॉटलर

2
इस निष्कर्ष पर आने के लिए मुझे घंटों लग गए। यही कारण है कि संपादित करें जवाब में क्या मुझे मेरे समाधान खोजने में मदद की है। धन्यवाद!
बेमेर्ग्यू

17

मैं इस समस्या पर अड़ गया था कि मैं एक समस्या का हल खोज रहा था जहाँ इकाई को अद्यतन करने के बाद नेविगेशन गुण आबाद नहीं हो रहे थे। जब भी मैंने डेटाबेस से इकाई को पुनः लोड करने का प्रयास किया, तो यह स्थानीय स्टोर से प्रविष्टि को हड़प लेगा, जो आलसी लोडिंग के माध्यम से नेविगेशन गुणों को नहीं बढ़ाएगा। संदर्भ को नष्ट करने और एक को फिर से बनाने के बजाय, मैंने पाया कि इससे मुझे काम के साथ ताजा डेटा प्राप्त करने की अनुमति मिली है:

_db.Entry(entity).State = EntityState.Detached;

इसके पीछे का तर्क था - मेरा अपडेट इकाई से जुड़ा हुआ है इसलिए यह इसमें बदलावों को ट्रैक करेगा। यह इसे स्थानीय स्टोर में जोड़ता है। तत्पश्चात, कार्यात्मक प्रॉक्स के साथ इकाई को पुनः प्राप्त करने के किसी भी प्रयास का परिणाम यह होगा कि वह स्थानीय को डीबी से बाहर निकालने के बजाय एक नए और प्रॉक्सी-सक्षम इकाई को वापस ले लेगा। मैंने ऊपर पुनः लोड विकल्प की कोशिश की, जो डेटाबेस से ऑब्जेक्ट को ताज़ा करता है, लेकिन यह आपको आलसी-लोडिंग के साथ अनुमानित वस्तु नहीं देता है। मैंने ए करने की कोशिश की Find(id), Where(t => t.Id = id), First(t => t.Id = id)। अंत में, मैंने उपलब्ध राज्यों की जाँच की जो प्रदान किए गए थे और देखा गया था कि एक "अलग किया गया" राज्य था। यूरेका! आशा है कि यह किसी की मदद करता है।


कृपया आलसी लोडिंग कार्य करने के लिए कृपया डिटैच्ड स्टेट को कहां लगाएं? मैंने आपके समाधान की कोशिश की और यह मेरे काम नहीं आया, मुझे कुछ याद करना चाहिए। आपकी मदद की सराहना की जाएगी
रेक्स

2
मैंने यह पता लगाया: 1. इकाई को बचाओ, 2. अलग करने के लिए राज्य सेट करें, 3. डीबी से इकाई को पढ़ें। संकेत के लिए धन्यवाद!
रेक्स

1

एक ही संदर्भ पर कोड चलाने से आपको अपडेटेड इकाइयां नहीं मिलेंगी। यह केवल रन के बीच डेटाबेस में बनाई गई नई संस्थाओं को जोड़ देगा। EF बल पुनः लोड इस तरह किया जा सकता है:

ObjectQuery _query = Entity.MyEntity;
_query.MergeOption = MergeOption.OverwriteChanges;
var myEntity = _query.Where(x => x.Id > 0).ToList();

1

मैंने कक्षा के हिस्से के रूप में, असाइनमेंट के बिना, इकाई चर घोषित किया। इसने मुझे अन्य तरीकों द्वारा संदर्भ के लिए चर को खोए बिना एक उदाहरण के निपटान की अनुमति दी। मैं अभी इसके पार आया था इसलिए इसमें बेल्ट के तहत रनटाइम का एक बहुत कुछ नहीं है, लेकिन अभी तक यह ठीक काम कर रहा है।

public partial class frmMyForm
{
    private My_Entities entity;

    public frmMyForm()
    {
        InitializeComponent();
    }

    private void SomeControl_Click(object sender, EventArgs e)
    {
        db.SaveChanges();
        db.Dispose();
        entity = new My_Entities();
        //more code using entity ...
}

0

मेरे लिए ... मैं अपने DbContext को इस तरह एक्सेस करता हूं:

_viewModel.Repo.Context

मैं ऐसा करने के लिए डेटाबेस को हिट करने के लिए EF को मजबूर करने के लिए:

_viewModel.Repo.Context = new NewDispatchContext();

एक नए उदाहरण के साथ वर्तमान DbContext को अधिलेखित करें। फिर अगली बार जब मैं अपनी डेटा सेवाओं का उपयोग करता हूं तो वे डेटाबेस से डेटा प्राप्त करते हैं।

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