2012-09-24 10 views
5

मैं एक एएसपी नेट MVC 3.0 वेब अनुप्रयोग से इकाई की रूपरेखा 4.3.1 का उपयोग कर रहा है और मुझे लगता है कि एक पुराने वस्तु detaches और एक नया उद्देश्य यह है कि तरह तो लग रहा है के साथ यह बदल देता है कोड का एक छोटा सा है:इकाई फ्रेमवर्क में अपवाद "इस संबंध प्रबंधक द्वारा अपवाद को वापस नहीं किया जा सकता" का मूल कारण क्या है?

public void UpdateUnattached(T entryToUpdate, T updatedEntry) 
{ 
    var ctx = (EntityFrameworkContext) _context;   
    ctx.ChangeObjectState(EntityState.Detached, entryToUpdate); 
    _set.Attach(updatedEntry);  
    ctx.ChangeObjectState(EntityState.Modified, updatedEntry); 
} 

यह एक मामले को छोड़कर हर समय काम करता है जब मुझे _set.Attach लाइन पर अपवाद मिलता है।

संबंधित संबंध इस रिलेशनशिप प्रबंधक द्वारा वापस नहीं किया जा सकता है। एक संबंधित अंत केवल उन ऑब्जेक्ट्स के लिए रिलेशनशिप मैनेजर द्वारा लौटाया जा सकता है जिन्हें ऑब्जेक्टस्टेट मैनेजर द्वारा ट्रैक किया जाता है या जो IEntityWithRelationships को लागू करता है।

ऑब्जेक्ट ग्राफ बहुत गहरा है और मुझे लगता है कि यह मुझे बता रहा है कि ऐसी संपत्ति है जो किसी ऑब्जेक्ट पर सेट की गई है जिसे कहीं भी ट्रैक नहीं किया गया है (अगर मैं गलत हूं तो कृपया मुझे सही करें)। तो, मेरा सवाल है ...

मैं कैसे पता लगा सकता हूं कि इस अपवाद का मूल कारण क्या है?

मैंने इसे पकड़ने/पकड़ने और पकड़ने में GetValidationErrors पर कॉल करने का प्रयास किया है, लेकिन यह भी उसी अपवाद के साथ फेंकता है। अपवाद से

अधिक जानकारी (InnerException रिक्त है) ...

Type: System.InvalidOperationException 
Source: System.Data.Entity 
Target site: GetRelatedEndInternal 
Stacktrace: at System.Data.Objects.DataClasses.RelationshipManager.GetRelatedEndInternal(String relationshipName, String targetRoleName) 
at System.Data.Objects.EntityEntry.FindRelatedEntityKeysByForeignKeys(Dictionary`2& relatedEntities, Boolean useOriginalValues) 
at System.Data.Objects.EntityEntry.TakeSnapshotOfForeignKeys() 
at System.Data.Objects.ObjectStateManager.PromoteKeyEntryInitialization(EntityEntry keyEntry, IEntityWrapper wrappedEntity, IExtendedDataRecord shadowValues, Boolean replacingEntry) 
at System.Data.Objects.ObjectContext.AttachSingleObject(IEntityWrapper wrappedEntity, EntitySet entitySet, String argumentName) 
at System.Data.Objects.ObjectContext.AttachTo(String entitySetName, Object entity) 
at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) 
at System.Data.Entity.Internal.Linq.InternalSet`1.Attach(Object entity) 
at System.Data.Entity.DbSet`1.Attach(TEntity entity) 
at ... snip ... 
+0

क्या आप संलग्न इकाई को उनको स्वैप करने की कोशिश करने के बिना अटैचमेंट इकाई के मानों के साथ अद्यतन नहीं करना चाहिए? आप इसके द्वारा कुछ संगठनों को काटते प्रतीत होते हैं। –

+0

धन्यवाद, हां - दिलचस्प बात यह है कि यदि आप कहते हैं तो ठीक है (प्रविष्टि की प्रत्येक संपत्ति को अद्यतन करने के लिए अद्यतन करें और फिर अटैचिंग के बजाय सहेजें) यह काम करता है। मैं जो जानना चाहता हूं, यही कारण है कि अनुलग्नक काम नहीं करता है और यह जानना कि मैं जानना चाहता हूं कि इस अपवाद के लिए मूल कारण क्या था। निश्चित रूप से जब से अपवाद फेंक दिया गया तो ढांचे को पता होना चाहिए - मैं चाहता हूं कि उसने मुझे बताया था। – kmp

+0

मुझे लगता है कि यह अलग है जो समस्याओं का कारण बनता है।मैं अपवाद से समझता हूं कि रिलेशनशिप मैनेजर किसी ऑब्जेक्ट के एसोसिएशन को हल करने का प्रयास करता है जिसे अब ट्रैक नहीं किया जाता है। –

उत्तर

0

यह एक वास्तविक समाधान की तुलना में की एक काम के आसपास अधिक है ...

मैं निर्धारित करने के लिए कि सक्षम किया गया है समस्या संग्रहों से संबंधित है जो संग्रह हैं। मुझे संदेह है कि लिंक एक शून्य संग्रह को पॉप्युलेट करने की कोशिश कर रहा है।

हमलावर वस्तु का निरीक्षण करने से मैंने पाया मैं समस्या को हल इस तरह काम कर सकते हैं:

पुराने कोड:

var myObject = db.MyObjectCollection.Find(x=>x.id = myId); 

नए कोड

var myCollection = db.MyObjectCollection.Where(x=>x.id = myId); 
if(myCollection != null && myCollection.Count() > 0){ 
    var myObject = myCollection.First(); 
} 

यह त्रुटि हल करता है। हालांकि, इस समाधान के साथ समस्या यह है कि यह केवल एक ही मामले में समस्या हल करता है जो त्रुटि को फेंकता है और कोई गारंटी नहीं है कि यह कहीं और फसल नहीं होगी। असल में, यह व्हाक-ए-ऑल खेलना थोड़ा सा रहा है क्योंकि त्रुटि अन्य परिस्थितियों में फिर से दिखाई देती है।

0

त्रुटि संदेश को देखने से मैं अनुमान लगा रहा हूं कि आप किसी अन्य ऑब्जेक्ट से संबंध स्थापित करने की कोशिश कर रहे हैं जिसे ऑब्जेक्टस्टेटमेनर द्वारा ट्रैक नहीं किया गया है (यानी संभवतः एक इकाई नहीं)।

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