2011-01-12 4 views
31

मैं बहुत यहां उनका उल्लेख मिलता-जुलता एक त्रुटि को हल करने की कोशिश कर रहा हूँ:ऑब्जेक्ट कॉन्टेक्स्ट पर अलग-अलग ईएफ 4 सेवऑप्शन का क्या प्रभाव पड़ता है?

InvalidOperationException when calling SaveChanges in .NET Entity framework

ऐसा लगता है कि समाधान (जो मैं अभी तक प्रयास नहीं किया है, बेशक) System.Data.Objects पारित करने के लिए है SaveChanges() विधि के लिए SaveOptions पैरामीटर के रूप में। NoOptions.None।

तो ऐसा करने से पहले, मैं समझने की कोशिश कर रहा हूं कि अलग-अलग SaveOptions कैसे काम करते हैं (कोई नहीं, AcceptAllChangesAfterSave, DetectAllChanges)। हालांकि, मैं इसके बारे में स्पष्ट स्पष्टीकरण नहीं पा रहा हूं, और न ही मुझे यकीन है कि डिफ़ॉल्ट क्या है। क्या कोई स्पष्टीकरण दे सकता है?

धन्यवाद!

अद्यतन: मैं वास्तविक समस्या सवाल यहाँ पोस्ट किया है: System.InvalidOperationException when trying to iteratively add objects using EF 4

उत्तर

17

अच्छा प्रश्न (+1)।

संक्षेप (मैं क्या समझ से) में:

SaveOptions.DetectChangesBeforeSave: यह डिफ़ॉल्ट है। जब आप ObjectContext.SaveChanges() करते हैं, तो विधि DetectChanges() को ओएसएम में सिंक्रनाइज़ किए गए अनुलग्नक इकाइयों के लिए बुलाया जाता है।

SaveOptions.AcceptAllChangesAfterSave: जब आप ObjectContext.SaveChanges() करते हैं, विधि AcceptAllChanges() कहा जाता है - जो OSM, जहां ग्राफ में संस्थाओं को दोहराया जाता है, पते और अलग अपरिवर्तित करने के लिए सेट/की हिम्मत है।

SaveOptions.None: जब आप ObjectContext.SaveChanges() करते हैं, तो परिवर्तन immeditately सहेजे जाते हैं - बिल्कुल सिंक्रनाइज़ेशन नहीं। ग्राफ में जो कुछ भी है वह बचाया जाएगा।

मेरे अनुभव में मैंने इसके साथ गड़बड़ नहीं की है - मैंने इसे डिफ़ॉल्ट (DetectChangesBeforeSave) के रूप में छोड़ दिया है।

कभी-कभी पीओसीओ के साथ मैंने सुना है कि आपको स्पष्ट रूप से DetectChanges पर कॉल करने की आवश्यकता है, लेकिन मैंने कभी भी SaveOptions को बदलने के लिए कोई सिफारिश/समाधान नहीं देखा है।

क्या आप वाकई उस प्रश्न का समाधान SaveOptions को किसी भी पर सेट करना चाहते हैं? हो सकता है कि आपको अपनी त्रुटि के रूप में विस्तार (या एक अलग प्रश्न पूछें) प्रदान करना चाहिए, क्योंकि इस तरह के बदलाव से आपकी पूरी दृढ़ता परत प्रभावित होगी।

+0

धन्यवाद के डिफ़ॉल्ट है - सवाल पूछने का मेरा कारण, क्योंकि यह इस मुद्दे को ठीक करने के लिए मेरे पूरे एप्लिकेशन को प्रभावित करेगा। मैं ऐसा करने के लिए बहुत अनिच्छुक हूं जो समाधान के साथ मैं पूरी तरह समझ नहीं पा रहा हूं। ओएसएम कहने पर आप क्या कह रहे हैं? संपादित करें: ऑब्जेक्टस्टेट प्रबंधक। समझ गया। :) – morganpdx

+0

और हाँ, मुझे एक प्रश्न पोस्ट करना चाहिए, क्योंकि यह एकमात्र समाधान है जो दूसरी समस्या में कहा गया है जो काम करने का दावा करता है जो मेरे मामले में लागू होगा। लेकिन यह एक ही समस्या है। – morganpdx

+0

@morganpdx - आपके पास ईएफ सेटअप कैसा है? क्या आप डिफ़ॉल्ट कोड पीढ़ी का उपयोग कर रहे हैं, या आप पीओसीओ का उपयोग कर रहे हैं? और यदि हां - क्या आप किसी भी परिवर्तन ट्रैकिंग का उपयोग कर रहे हैं (जैसे स्वयं ट्रैकिंग इकाइयां, प्रॉक्सी ऑब्जेक्ट्स इत्यादि)। इस जानकारी और आपके पास होने वाली त्रुटि/परिदृश्य/समस्या के साथ एक प्रश्न पोस्ट करें। डिफ़ॉल्ट कोड पीढ़ी का उपयोग कर – RPM1984

18

के लिए

SaveOptions.DetectChangesBeforeSave लघु सुधार: यह डिफ़ॉल्ट है। जब आप ऑब्जेक्ट कॉन्टेक्स्ट। सेव चेंज(), विधि DetectChanges() को ओएसएम में सिंक्रनाइज़ किए गए अनुलग्नक इकाइयों को बुलाया जाता है।

SaveChanges SaveChanges(SaveOptions optsions) विधि है, जहां इस parameterless संस्करण कॉल इस

SaveChanges(SaveOptions.DetectChangesBeforeSave | SaveOptions.AcceptAllChangesAfterSave) 

SaveOptions का एक अतिभारित संस्करण एक झंडा enum है और अंत में, SaveOptions.DetectChangesBeforeSave | SaveOptions.AcceptAllChangesAfterSaveSaveChanges() नहीं DetectChangesBeforeSave