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