मैं एंटिटी फ्रेमवर्क कोड के साथ किसी समस्या में भाग रहा हूं-पहले एमवीसी 3 में। मैं इस अपवाद को मार रहा हूं:इकाई फ्रेमवर्क कोड-प्रथम: "ऑब्जेक्टस्टेट प्रबंधक एक ही कुंजी के साथ एकाधिक ऑब्जेक्ट्स को ट्रैक नहीं कर सकता है।"
ऑब्जेक्टस्टेट प्रबंधक में एक ही कुंजी वाला एक ऑब्जेक्ट पहले से मौजूद है। ऑब्जेक्टस्टेट प्रबंधक एक ही कुंजी के साथ एकाधिक ऑब्जेक्ट्स को ट्रैक नहीं कर सकता है।
यह एसओ पर कई बार संबोधित किया गया है, लेकिन मुझे अपनी स्थिति में सुझाए गए समाधानों में से किसी एक का उपयोग करने में परेशानी हो रही है।
FestORM.SaleMethod method = new FestORM.SaleMethod
{
Id = 2,
Name = "Test Sale Method"
};
FestContext context = new FestContext();
//everything works without this line:
string thisQueryWillMessThingsUp =
context.SaleMethods.Where(m => m.Id == 2).Single().Name;
context.Entry(method).State = System.Data.EntityState.Modified;
context.SaveChanges();
संपादित स्पष्ट करने के लिए: मैं एक उद्देश्य यह है कि पहले से ही डेटाबेस में मौजूद है अद्यतन करने के लिए प्रयास कर रहा हूँ
यहाँ एक कोड नमूना है।
सब कुछ कोड में उल्लिखित क्वेरी के बिना ठीक काम करता है। मेरे आवेदन में, मेरा नियंत्रक संदर्भ को तत्काल कर रहा है, और यह संदर्भ कई रिपॉजिटरीज़ को पास किया जाता है जो नियंत्रक द्वारा उपयोग किए जाते हैं - इसलिए मैं प्रारंभिक क्वेरी ऑपरेशन के लिए बस एक अलग संदर्भ का उपयोग करने में सक्षम नहीं हूं। मैंने ऑब्जेक्टस्टेट मैनेजर में ट्रैक होने से इकाई को निकालने का प्रयास किया है, लेकिन मुझे इसके साथ कहीं भी नहीं मिल रहा है। मैं एक समाधान का पता लगाने की कोशिश कर रहा हूं जो दोनों स्थितियों के लिए काम करेगा: कभी-कभी मैं ऑब्जेक्टस्टेट मैनेजर द्वारा ट्रैक की गई ऑब्जेक्ट को अपडेट कर रहा हूं, और कभी-कभी ऐसा नहीं होता है कि यह अभी तक ट्रैक नहीं किया गया है।
Fwiw, मेरा असली भंडार काम करता है, इस तरह दिखेगा बस ऊपर कोड की तरह:
public void Update(T entity)
{
//works ONLY when entity is not tracked by ObjectStateManager
_context.Entry(entity).State = System.Data.EntityState.Modified;
}
public void SaveChanges()
{
_context.SaveChanges();
}
कोई भी विचार? मैं लंबे समय के लिए इस लड़ रहा है ...
धन्यवाद। (यह मुझे आपकी प्रतिक्रिया को वोट नहीं देगा क्योंकि मैं नया हूं।) इसके साथ समस्या यह है कि मुझे नहीं पता कि मैं एक प्रश्न कर रहा हूं जो भविष्य के अद्यतन से पहले है। क्वेरी को सर्विस लेयर में कहीं दफनाया जा सकता है, और आखिरकार, जब मैं पूछताछ की गई उसी इकाई पर एक अद्यतन करने के लिए जाता हूं, तो मैंने त्रुटि को मारा। क्या कोई तरीका है कि मैं ऑब्जेक्ट को संदर्भ ट्रैकिंग से हटा सकता हूं, या संदर्भ द्वारा ट्रैक किए जा रहे ऑब्जेक्ट को रोक सकता हूं, और संदर्भ में संवाद कर सकता हूं कि मैं वास्तव में इस ऑब्जेक्ट को प्रश्न में अपडेट कर रहा हूं? मैंने इस दिशा में कुछ शोध किया है, लेकिन अभी तक कोई भाग्य नहीं है। – Josh
यह निर्भर करता है कि क्वेरी का इरादा क्या है। यदि क्वेरी का उद्देश्य किसी इकाई को संदर्भ में लाने का इरादा है ताकि इसे अद्यतन और सहेजा जा सके, जो कि सामान्य है, तो आपको इसके लिए डिज़ाइन करना चाहिए, संभवत: यह सुनिश्चित करने से पहले कि यह सुनिश्चित करने से पहले कि इकाई को लाया गया है, पहले लाया गया था। यदि क्वेरी का इरादा किसी इकाई के संदर्भ में इकाई को बिना किसी कारण के डेटाबेस से इकाई की कुछ संपत्ति प्राप्त करना है, तो ऊपर दिखाए गए अनुसार उस क्वेरी पर AsNoTracking का उपयोग करें। –
मेरी पिछली टिप्पणी में जोड़ने के लिए, यदि आप यह सुनिश्चित करना चाहते हैं कि इकाई को लाया गया है, तो इकाई में गुणों को अपडेट करने और सहेजने से पहले ढूँढें विधि का उपयोग करें। आप खोज के बजाय एक क्वेरी का भी उपयोग कर सकते हैं - डिफ़ॉल्ट रूप से क्वेरी केवल इकाई में लाएगी यदि यह पहले से संदर्भ में नहीं है। लेकिन खोजें अधिक कुशल है। –