2011-10-26 13 views
8

SQL संचार के लिए एंटीटी फ्रेमवर्क का उपयोग करते समय मुझे प्रतिक्रिया समय का अजीब पैटर्न मिल रहा है।डीबगिंग एंटिटी फ्रेमवर्क एसक्यूएल स्टेटमेंट्स

यह मेरी वेब होस्ट से है:

enter image description here

यह मेरा स्थानीय सर्वर से है:

enter image description here

यह प्रतिक्रिया समय में वृद्धि मैं के बारे में चिंतित हूँ। मैंने समस्या Nop.Data> EfRepository.cs> सार्वजनिक शून्य सम्मिलित करें (टी इकाई)> _entities.Add (इकाई) में समस्या को एक पंक्ति में संकुचित कर दिया है; हां, मुझे यह NopCommerce के लिए बहुत विशिष्ट पता है, लेकिन बिंदु वास्तव में है कि मैं उसे डीबग करने के तरीके पर सहायता के लिए देख रहा हूं।

क्या कुछ ऐसी घटनाएं हैं जिन्हें मैं पकड़ सकता हूं जो SQL को निष्पादित करता है? या उपरोक्त आदेश में एंटीटी फ्रेमवर्क में वास्तव में क्या हो रहा है, यह जानने के लिए मैं और क्या कर सकता हूं।

उत्तर

21

एफई प्रश्नों डिबगिंग के लिए, सबसे आसान काम ToTraceString ObjectQuery करने के लिए क्वेरी डाली और उपयोग करने के लिए है:

var query = myContext.MyTable 
    .Where(r => r.Id == searchId) 
    .Select(r => r); 

Console.WriteLine(((ObjectQuery)query).ToTraceString()); 

इस क्वेरी के लिए अंतर्निहित एसक्यूएल दिखाई देगा, और तुम क्यों डिबग करने के लिए मैन्युअल रूप से क्वेरी चला सकते हैं वे धीमे हैं।

http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx

आप एसक्यूएल जो चलाया जाता है जब आप SaveChanges() आपके संदर्भ पर फोन करने की कोशिश कर रहे हैं, यह के रूप में आसान नहीं है: यहाँ MSDN कड़ी है। आप EFTracingProvider पर एक नज़र ले सकता है:

http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx

या, आप एसक्यूएल सर्वर का उपयोग यह सोचते हैं, आप एसक्यूएल प्रोफाइलर पर सीधे जाने और टी SQL कथन पर कब्जा कर सकते हैं (यह मेरी पसंदीदा तरीका है)।

+0

धन्यवाद, मैं पहली बार कोशिश करूंगा क्योंकि SaveChanges() कॉल में इतना समय नहीं लगता है, कम से कम जिस पंक्ति में मैंने लिखा था वह बहुत समय लगा। मैं मेजबान पर प्रतिबंधों के कारण प्रोफाइलर (मैंने कोशिश की) का उपयोग नहीं कर सकता। – Anders

+0

मुझे पता चला कि समस्या का वह हिस्सा विशिष्ट वर्गों के लिए वस्तुओं के कास्टिंग के संबंध में कोड के भीतर था। तो समस्या शायद एसक्यूएल से संबंधित नहीं था – Anders

8

EF6 में, आप भी यह आपके dbcontext

उदाहरण के निर्माता

public BookServiceContext() : base("name=BookServiceContext") 
{ 
    // New code: 
    this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 
} 

यह कंसोल हर SQL क्वेरी एफई उत्पन्न करने के लिए लॉग इन करेंगे में कर सकते हैं। अधिक जानकारी के लिए यह आलेख देखें http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/

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