2011-03-23 17 views
7

ईएफ 4.1 आरसी। डीबीसीएन्टेक्स्ट से एक इकाई को जोड़ा/संलग्न करने के बाद मैं कुछ कोड चलाने के लिए चाहता हूं। इसके लिए कोई घटना है (मुझे एक नहीं मिल रहा है)। असल में मैं यह जांचना चाहता हूं कि जोड़ा/संलग्न इकाई एक निश्चित इंटरफेस का है और यदि ऐसा है, तो इसके साथ कुछ सामान करें। धन्यवाद!डीबीसीएन्टेक्स्ट जोड़ा गया/संलग्न घटना?

+0

रूप Ladislav कहा, वहाँ कोई तानाना है। यदि आप कुछ और अधिक शक्तिशाली (और अधिक जटिल नहीं हैं, तो आप सीखने के इच्छुक हैं) की तलाश कर रहे हैं, तो मैं एनएचबीर्नेट की सलाह देता हूं। यह वही करता है जो आप चाहते हैं और अधिक। –

उत्तर

11

दुर्भाग्य से ऐसी कोई घटनाएं उपलब्ध नहीं हैं और ऐसी घटनाओं को जोड़ने के लिए कोई विस्तार बिंदु नहीं है। यह मेरी सबसे बड़ी ईएफ विफलता में से एक है। विस्तारशीलता = शून्य।

केवल एक चीज आप कर सकते हैं SaveChanges ओवरराइड और base.SaveChanges उपयोग ChangeTracker को क्रियान्वित करने के लिए अपने प्रकार के सभी संलग्न और कहा कि संस्थाओं और अपने तर्क पर अमल करने से पहले है। लेकिन यह संदर्भ में किसी इकाई को जोड़ने या जोड़ने के दौरान एक ईवेंट ट्रिगर करने जैसा नहीं है।

+0

बमर ......... –

+0

मैं मूल प्रश्न में संकेत के अनुसार v 4.1 के खिलाफ परीक्षण नहीं कर रहा हूं, लेकिन @ केवीरवॉल्ड का जवाब बस ठीक है! EF5 में ऑब्जेक्टस्टेट मैनेजर के उपयोग का परीक्षण किया और यह बहुत अच्छा काम करता है। – BenSwayne

+0

@ बेन्सवेन: हां। इसे एक उत्तर के रूप में चिह्नित किया जाना चाहिए। –

19

संदर्भ में परिवर्तनों को ट्रैक करने के लिए आप ObjectStateManager की ObjectStateManagerChanged ईवेंट का उपयोग कर सकते हैं। ObjectStateManager पहुंचने के लिए, आप की तरह

var contextAdapter = ((IObjectContextAdapter)dbcontext);    
contextAdapter.ObjectContext 
       .ObjectStateManager 
       .ObjectStateManagerChanged += ObjectStateManagerChanged; 

DbContext कास्टिंग एक बार जब आप घटना मिला के लिए IObjectContextAdapter उपयोग करने के लिए है, यह जोड़ने या ObjectStateManager लिए संस्थाओं को हटाने के द्वारा हर बार संग्रह बदल जाती है आग। इकाई की स्थिति को ट्रैक करने के लिए, ObjectStateManager के GetObjectStateEntry() का उपयोग करें और CollectionChangeEventArgs परम के Element का उपयोग करें।

CollectionChangeEventArgs के दोनों राज्यों और संयोजन ObjectStateEntry आप ट्रैक कर सकते हैं, क्या हो रहा है ....

+0

यह अच्छा लगता है, हालांकि मेरे परीक्षण में, ऑब्जेक्टस्टेट मैनेजर चेंज को वास्तव में डेटाबेस कहा जाता है _before_ डेटाबेस में कुछ भी सहेजा जाता है (जब आप एड() को कॉल करते हैं तो इसे उत्सर्जित किया जाता है, और ऑब्जेक्ट कॉन्टेक्स्ट। सेविंग चेंज कुछ हद तक सहेजने से पहले बुलाया जाता है। मुझे कुछ भी नहीं मिला है जिसे _after_ कहा जाता है, परिवर्तन सहेजे जाते हैं ... (ईएफ 6 में) – Josh

+0

@ जोश जो आपके स्वयं के उदाहरण प्रदान करने का एक कारण है। ईएफ के चारों ओर "काम की इकाई" रैपर - यह आपको परिवर्तनों को सहेजते समय प्रबंधित करने की अनुमति देता है, बनाम जब प्रतिबद्ध कहा जाता है (यदि आपने अपना लेनदेन खोला है)। हालांकि, मेरी परिस्थितियों के लिए, राज्य ने प्रबंधक को बदल दिया जो वास्तव में मुझे प्रदान करने के लिए दिखता है। – Nathan

4

प्रासंगिक DbSet के स्थानीय संपत्ति (ObservableCollection) के लिए CollectionChanged घटना संभाल।

जोड़े गए/संलग्न इकाई ऑब्जेक्ट की DbEntityEntry के राज्य को क्रमशः जोड़ा/संलग्न के लिए जोड़ा या unmodified के लिए जांचें।

DbSet.Local संपत्ति: http://msdn.microsoft.com/en-us/library/gg696248(v=vs.103).aspx

DbContext.Entry विधि: http://msdn.microsoft.com/en-us/library/gg696578(v=vs.103).aspx

+0

ध्यान दें कि यह काम करता है और, मेरे लिए उपयोग करने का एक शानदार तरीका होता, हालांकि यह घटना को उत्सर्जित करता है _before_ इकाई वास्तव में डेटाबेस में सहेजी जाती है, इसलिए कुछ गलत होने पर यह "झूठी सकारात्मक" ट्रिगर कर सकता है। – Josh

+0

(उपरोक्त ईएफ 6 में है) – Josh

+0

प्रश्न 'डीबीकॉन्टेक्स्ट' से जोड़े/संलग्न होने के बाद एक निश्चित प्रकार की प्रसंस्करण इकाइयों के बारे में पूछा गया। यदि आप सफलतापूर्वक डीबी में सहेजे जाने के बाद आगे प्रसंस्करण करना चाहते हैं, तो 'डीबी कॉन्टेक्स्ट। सेव चेंज' विधि को ओवरराइड करें और 'बेस। सेव चेंज' विधि को कॉल करने के बाद अपने तर्क को कार्यान्वित करें। – Moho

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