2012-10-04 26 views
6

परिवर्तनों को ट्रैक रखने के एन-टियर समाधान पर जूलिया लर्मास पुस्तक 'डीबीकॉन्टेक्स्ट' के बाद, मैंने प्रत्येक इकाई को एक राज्य संपत्ति और मूल वैल्यू डिक्शनरी (IObjectWithState के माध्यम से) प्रदान की। इकाई का निर्माण करने के बाद मैं मूल मानों को इस शब्दकोश में कॉपी करता हूं। इस नमूने (4-23) पुस्तक के देखें:DbContext.Entry प्रदर्शन समस्या

public BreakAwayContext() 
{ 
    ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += (sender, args) => 
    { 
     var entity = args.Entity as IObjectWithState; 
     if (entity != null) 
     { 
     entity.State = State.Unchanged; 
     entity.OriginalValues = BuildOriginalValues(this.Entry(entity).OriginalValues); 
     } 
    }; 
} 

BreakAwayContext (DbContext से विरासत में मिली) ObjectMaterialized घटना पकड़ा है की निर्माता हैं। संस्था की मूल मूल्यों को पुनः प्राप्त करने के लिए, DbEntityEntry this.Entry (इकाई) के लिए कॉल द्वारा संदर्भ से लिया गया है। यह कॉल प्रक्रिया को धीमा कर रही है। इस घटना के 80% समय हैंडलर इस कॉल पर खर्च करते हैं।

वहाँ एक तेज़ तरीका मूल मानों या संस्थाओं DbEntityEntry पुनः प्राप्त करने के है?

+0

आप उसे अन्य सुझाव की कोशिश की है, बजाय बदली हुई मानों की सूची स्टोर करने के लिए? मैंने सोचा था कि मूल मूल्यों के भंडारण, महंगा होगा तो मेरी बहु स्तरीय (बहु मंच) के घोल में, मैं एक अल्पविराम से अलग सूची नेट में टी -4 टेम्पलेट का उपयोग कर डेल्फी की प्रत्येक प्रॉपर्टी की setters अधिभावी द्वारा बदला गुण (डेल्फी में युक्त स्टोर सर्वप्रथम)। डीएएल में जब एक इकाई (या डीटीओ) अपडेट के लिए भेजी जाती है, तो मैं प्रत्येक परिवर्तित संपत्ति को संशोधित के रूप में लूप करता हूं और चिह्नित करता हूं। यह मूल मानों को पुनर्प्राप्त करने के लिए एक तेज़ तरीका नहीं बताता है, लेकिन यह डिस्कनेक्ट किए गए परिवर्तन ट्रैकिंग को प्राप्त करेगा। – reckface

उत्तर

12

Context.Entry() DetectChanges() उस संदर्भ में वस्तुओं की संख्या पर निर्भर करता है और बहुत धीमी गति से हो सकता है कहते हैं। आपके मामले में आप तेजी से संस्करण के साथ बदल सकते ((IObjectContextAdapter) ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(obj);

+0

धन्यवाद! मैंने बस अपनी वैकल्पिक विधि का उपयोग करने के लिए अपना कोड बदल दिया। 8 सेकंड से .003 – BigJoe714

+0

आश्चर्यजनक! व्यावहारिक रूप से 0 सेकंड से राज्य कॉल प्राप्त करें! मैं ((IObjectContextAdapter) ctx) .ObjectContext.ObjectStateManager.GetObjectStateEntry (obj) .ChangeState (EntityState.Modified) का इस्तेमाल किया; –

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