2009-02-26 14 views
36

मैं ADO.NET इकाई फ्रेमवर्क के साथ एक एप्लिकेशन बना रहा हूं।मैं एंटिटी फ्रेमवर्क के लंबित परिवर्तन कैसे देख सकता हूं?

मैं डीबगिंग करते समय अपने कोड लाइन-दर-लाइन के माध्यम से कदम उठा सकता हूं और निष्पादित प्रत्येक क्वेरी के लिए SQL सर्वर प्रोफाइलर देख सकता हूं, लेकिन मैं यह नहीं समझ सकता कि उन सभी SQL आदेश कहां से आ रहे हैं!

कभी-कभी जब मैं SaveChanges() निष्पादित करता हूं, तो इकाई फ्रेमवर्क अप्रत्याशित, अजीब इंसर्ट करता है। वे कभी-कभी आवेदन तोड़ते हैं। मैं यह नहीं समझ सकता कि मैं उन्हें क्या कर रहा हूं।

मैं लंबित परिवर्तनों की निगरानी कैसे कर सकता हूं जो SaveChanges() कॉल के लिए प्रतीक्षा कर रहे हैं?

उत्तर

20

myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added) 

here पर एक नजर डालें। जब संस्थाओं को जोड़ा या राज्य प्रबंधक से निकाल दिए जाते

+9

आप एक DbContext वस्तु का उपयोग कर रहे हैं तो आप एक IObjectContextAdapter करने के लिए इसे कास्ट करने के लिए इससे पहले कि आप ObjectStateManager उपयोग कर सकते हैं की आवश्यकता होगी। उदाहरण: ((IObjectContextAdapter) dbcontext) .bjectContext.ObjectStateManager – Corin

8

घटनाओं पर नजर रखने के लिए, आपको ObjectStateManagerChanged घटना का उपयोग कर सकते हैं:

var ctx = new ModelContainer(); 

// ... 

ctx.ObjectStateManager.ObjectStateManagerChanged += (sender, e) => 
{ 
    Trace.WriteLine(string.Format("{0}, {1}", e.Action, e.Element)); 
}; 
36

इकाई की रूपरेखा 5.0 DbContext के बाद से एक ChangeTracker property जो सभी लंबित परिवर्तन है है। करने के लिए इसी तरह के ObjectStateManager इस प्रकार आप विभिन्न राज्यों में संस्थाओं प्राप्त कर सकते हैं:

myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Added); 
myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted); 
myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Modified); 
+3

धन्यवाद, ऐसा लगता है कि यह EF5 + – Peter

+0

के लिए एकमात्र सही उत्तर है, मैं इसे तत्काल विंडोज़ में एक्सेस नहीं कर सकता! मुझे [यह त्रुटि] मिलती है (http://imgur.com/a/2CsQn)। – Ciwan

+0

ठीक है, क्या एसक्यूएल प्राप्त करने का कोई तरीका है कि ईएफ उन परिवर्तनों का प्रयास करने जा रहा है? –

2

इकाई की रूपरेखा 6 कि के लिए एक विधि, वास्तव में उपयोगी है।

dbContext.ChangeTracker.HasChanges() 

उदाहरण:

if (dbContext.ChangeTracker.HasChanges()) 
{ 
    db.SaveChanges(); 
} 
संबंधित मुद्दे