2017-01-11 8 views
5

पर कॉल करने के बाद इकाई फ्रेमवर्क परिवर्तन ट्रैकिंग, मैं एफई 6 में परिवर्तन ट्रैकिंग के साथ कुछ समझने के लिए संघर्ष कर रहा हूं।टूलीस्ट()

मेरे पास इसी तरह का कोड है।

public class SomeClass 
{ 
    private List<User> _users; 
    private DAL _dal; 

    public void ProcessUsers() 
    { 
     _users = _dal.GetUsers(); 

     foreach(var u in users) 
     { 
      u.user.Comment = "This is a test"; 
     } 

     _dal.SaveChanges(); 
    } 
} 

दाल वर्ग एक छोटे से इस तरह दिखता है।

public class DAL 
{ 
    ... 
    private DataContext _context; // Assume that this is being newed up in a constructor. 

    public List GetUsers() 
    { 
     return _context.Users.ToList(); 
    } 

    public void SaveChanges() 
    { 
     _context.SaveChanges(); 
    } 
} 

तो जैसा कि हम ProcessUsers विधि में कोड से देख सकते हैं हम उन की एक सूची है और हम उस सूची को संशोधित कर रहे हैं।

अब मुझे पता है कि यह काम करता है, इसका रास्ता मैं हमेशा यह किया है लेकिन मैं धारणा है कि सूची में वस्तुओं (इस मामले में उपयोगकर्ता) DBSet स्थानीय में इसी वस्तु के लिए एक संदर्भ वापस थे तहत हमेशा था संग्रह।

कुछ विचारों के बाद मुझे यकीन नहीं है कि यह मामला है जैसे कि संदर्भ का निपटारा किया गया है, सूची अभी भी आबादी में है और इसे छेड़छाड़ की जा सकती है (हम इसे कुछ अतिरिक्त काम किए बिना डेटाबेस में वापस धक्का देने की क्षमता को खो देते हैं) इसलिए उस परिप्रेक्ष्य से सूची में आइटम डीबीएसईटी स्थानीय संग्रह से वस्तुओं की प्रतियां होनी चाहिए ... लेकिन यदि ऐसा है तो मुझे यह नहीं होगा कि सूची में किसी ऑब्जेक्ट में हेरफेर करने से ऑब्जेक्ट पर कोई प्रभाव पड़ेगा dbset में यह एक प्रतिलिपि होगी।

सारांश में

प्रश्न क्या होता है जब मैं एक DBSet पर ToList फोन और कैसे इस उदाहरण में ट्रैकिंग काम परिवर्तन होता है? - मुझे पता है कि यह काम करता है, लेकिन मुझे लगता है कि मेरी वर्तमान समझ गलत हो सकती है।

उत्तर

0

आपको अद्यतन ऑब्जेक्ट को चिह्नित करने के लिए context.TableName.Update(obejct) का उपयोग करने की आवश्यकता है। अगला तो अपने उदाहरण

public void ProcessUsers() 
{ 
    _users = _dal.GetUsers(); 

    foreach(var u in users) 
    { 
     u.user.Comment = "This is a test"; 
     _dal.Users.Update(u); 
    } 

    _dal.SaveChanges(); 
} 
+0

ठीक है, नहीं, यह मेरा मुद्दा है, जो कोड मैंने पोस्ट किया है वह टूटा नहीं है, यह काम करता है। मैं सिर्फ यह समझना चाहता हूं कि डीबीएसईटी पर ToList() क्या करता है, मुझे लगता है कि सूची dbset स्थानीय संग्रह से मूल ऑब्जेक्ट्स के संदर्भों के साथ पॉप्युलेट की गई है। लेकिन जो मैंने इसे पढ़ा है, उससे वे प्रतियां हैं - हालांकि अगर ऐसा होता है तो परिवर्तन ट्रैकिंग काम नहीं करेगी और उपर्युक्त कोड विफल हो जाएगा। – D3vy

1

एफई एक संग्रह है, जहां सभी लंबित परिवर्तन ट्रैक किया जाता है (_context.ObjectStateManager, see here...) है में context.Savechanges(); का उपयोग कर परिवर्तन सहेजें। ईएफ के साथ और अधिक लोडिंग इकाइयां आपको अपनी वास्तविक इकाई-वर्ग के बजाय प्रॉक्सी इंस्टेंस मिलता है। इस प्रॉक्सी ईएफ का उपयोग करना आपके इकाई उदाहरणों में "इंजेक्शन" कोड है जो अद्यतन ट्रैकिंग जानकारी बदलता है।

जब आप अपना संदर्भ निपटान करते हैं तो आप इस जानकारी को खो देते हैं। मौजूदा इकाई उदाहरण को किसी अन्य संदर्भ में जोड़ने के लिए आप _context.Attach() विधि का उपयोग कर सकते हैं।

SaveChanges()_context.ObjectStateManager जानकारी को संसाधित करता है।

+0

हाय, क्षमा करें मुझे नहीं लगता कि मैं अपने प्रश्न में स्पष्ट हूं, मुझे पता है कि ट्रैकिंग कार्य कैसे बदलता है, और ऊपर दिए गए उदाहरण में कोड काम करता है। मुझे लगता है कि मैं पूछ रहा हूं कि जब मैं डीबीसेट पर सूची करता हूं तो उस सूची में क्या जाता है ... डीबीसेट में वस्तुओं की प्रतियां या उन वस्तुओं के संदर्भ? खुदाई करने के बाद और काम पर दूसरों से बात करने के बाद मुझे काफी यकीन है कि सूची प्रतियों की बजाय डीबीसेट की सामग्री के संदर्भों के साथ आबादी होनी चाहिए। – D3vy