दिलचस्प पोस्ट
सी # में, मैं स्टाइल ट्रेस को खोए बिना इनरएक्सेशन को कैसे पुनः ला सकता हूं? ऑरेकल में चुनिंदा क्वेरी के लिए डिफ़ॉल्ट पंक्ति क्रम MSI vs nuget संकुल: कौन सी लगातार डिलीवरी के लिए बेहतर है? डी 3 के साथ एसवीजी तत्व जेड-इंडेक्स को अद्यतन करना Ctypes के साथ सी ++ क्लासेस का उपयोग कैसे करें? जब मेरे पास सूचीबॉक्सेज़ में मेरे पास छवियाँ हैं, तो मुझे आउटऑफ़मॉमी अपवाद क्यों मिलता है? JS के साथ एक HTML स्ट्रिंग पार्स करें स्काला कैसे लागू होता है () विधि जादू काम करता है? जावा में एकाधिक विरासत SQL सर्वर: पंक्तियों को स्तंभों में स्थानांतरित करें कैसे jQuery में बुदबुदाती घटनाओं को रोकने के लिए? एमवीवीएम पैटर्न का उपयोग करके प्रगति पट्टी को कैसे लागू किया जाए आप अपने संस्करण नियंत्रण भंडार को व्यवस्थित कैसे करते हैं? नॉरटरन का क्या मतलब है? एंकर टैग के अंदर एंकर टैग बनाना

मैं एसटीआईटी इकाई फ्रेमवर्क द्वारा उत्पन्न कैसे देखूं?

मैं एसटीएल को संस्था ढांचा द्वारा उत्पन्न कैसे देखूं?

(मेरे विशेष मामले में मैं mysql प्रदाता का उपयोग कर रहा हूं – यदि यह मामला है)

वेब के समाधान से एकत्रित समाधान "मैं एसटीआईटी इकाई फ्रेमवर्क द्वारा उत्पन्न कैसे देखूं?"

आप निम्न कर सकते हैं:

IQueryable query = from x in appEntities where x.id = 32 select x; var sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString(); 

या ईएफ 6 में:

 var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query) .ToTraceString(); 

यह आपको एसक्यूएल देगा जो उत्पन्न हुआ था।

जिन लोगों को इकाई फ्रेमवर्क 6 और ऊपर का उपयोग करना है, यदि आप दृश्य स्टूडियो में आउटपुट SQL देखना चाहते हैं (जैसे मैंने किया था) तो आपको नए लॉगिंग / इंटरसेप्शन कार्यक्षमता का उपयोग करना होगा

निम्नलिखित पंक्ति को जोड़ना, विजुअल स्टूडियो आउटपुट पैनल में उत्पन्न एसक्यूएल (अतिरिक्त निष्पादन-संबंधित विवरणों के साथ) थूक देगा:

 using (MyDatabaseEntities context = new MyDatabaseEntities()) { context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); // query the database using EF here. } 

इस निफ्टी ब्लॉग श्रृंखला में ईएफ 6 में लॉगिंग के बारे में अधिक जानकारी: http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/

नोट: सुनिश्चित करें कि आप अपना प्रोजेक्ट DEBUG मोड में चल रहे हैं।

यदि आप एक DbContext का उपयोग कर रहे हैं, तो आप SQL प्राप्त करने के लिए निम्न कार्य कर सकते हैं:

 var result = from i in myContext.appEntities select new Model { field = i.stuff, }; var sql = result.ToString(); 

EF6.1 से प्रारंभ करना आप डेटाबेस लॉगर को पंजीकृत करने के लिए इंटरसेप्टर का उपयोग कर सकते हैं। यहां फाइल में अध्याय "इंटरसेप्टर" और "लॉगिंग डाटाबेस ऑपरेशंस" देखें

 <interceptors> <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"> <parameters> <parameter value="C:\Temp\LogOutput.txt"/> <parameter value="true" type="System.Boolean"/> </parameters> </interceptor> </interceptors> 

दो तरीके हैं:

  1. उत्पन्न होने वाली एसक्यूएल को देखने के लिए, बस ToTraceString() कॉल करें आप इसे अपनी घड़ी खिड़की में जोड़ सकते हैं और एक ब्रेकपॉइंट सेट कर सकते हैं यह देखने के लिए कि किसी भी LINQ क्वेरी के लिए किसी भी बिंदु पर क्वेरी क्या होगी।
  2. आप पसंद के अपने एसक्यूएल सर्वर के लिए एक ट्रैसर संलग्न कर सकते हैं, जो आपको अपने सभी दुर्भाग्यपूर्ण विवरण में अंतिम क्वेरी दिखाएगा। MySQL के मामले में, क्वेरी का पता लगाने का सबसे आसान तरीका tail -f साथ क्वेरी लॉग को tail -f आप आधिकारिक दस्तावेजों में MySQL की लॉगिंग सुविधाओं के बारे में अधिक जानकारी प्राप्त कर सकते हैं। SQL सर्वर के लिए, सबसे आसान तरीका शामिल एसक्यूएल सर्वर प्रोफाइलर का उपयोग करना है

आप ईएफ 4.1 में निम्न कर सकते हैं:

 var result = from x in appEntities where x.id = 32 select x; System.Diagnostics.Trace.WriteLine(result .ToString()); 

यह आपको एसक्यूएल देगा जो उत्पन्न हुआ था।

ईएफ 6.0 और इसके बाद के संस्करण के लिए लागू: लॉगिंग कार्यक्षमता के बारे में अधिक जानने के लिए और पहले से ही दिए गए कुछ उत्तरों को जोड़ना चाहते हैं।

ईएफ से डाटाबेस को भेजे जाने वाले कमांड अब लॉग इन हो सकते हैं। ईएफ 6.x से उत्पन्न प्रश्नों को देखने के लिए, DBContext.Database.Log property उपयोग करें

क्या हो जाता है लॉग इन

  - SQL for all different kinds of commands. For example: - Queries, including normal LINQ queries, eSQL queries, and raw queries from methods such as SqlQuery. - Inserts, updates, and deletes generated as part of SaveChanges - Relationship loading queries such as those generated by lazy loading - Parameters - Whether or not the command is being executed asynchronously - A timestamp indicating when the command started executing - Whether or not the command completed successfully, failed by throwing an exception, or, for async, was canceled - Some indication of the result value - The approximate amount of time it took to execute the command. Note that this is the time from sending the command to getting the result object back. It does not include time to read the results. 

उदाहरण:

 using (var context = new BlogContext()) { context.Database.Log = Console.Write; var blog = context.Blogs.First(b => b.Title == "One Unicorn"); blog.Posts.First().Title = "Green Eggs and Ham"; blog.Posts.Add(new Post { Title = "I do not like them!" }); context.SaveChangesAsync().Wait(); } 

आउटपुट:

 SELECT TOP (1) [Extent1].[Id] AS [Id], [Extent1].[Title] AS [Title] FROM [dbo].[Blogs] AS [Extent1] WHERE (N'One Unicorn' = [Extent1].[Title]) AND ([Extent1].[Title] IS NOT NULL) -- Executing at 10/8/2013 10:55:41 AM -07:00 -- Completed in 4 ms with result: SqlDataReader SELECT [Extent1].[Id] AS [Id], [Extent1].[Title] AS [Title], [Extent1].[BlogId] AS [BlogId] FROM [dbo].[Posts] AS [Extent1] WHERE [Extent1].[BlogId] = @EntityKeyValue1 -- EntityKeyValue1: '1' (Type = Int32) -- Executing at 10/8/2013 10:55:41 AM -07:00 -- Completed in 2 ms with result: SqlDataReader UPDATE [dbo].[Posts] SET [Title] = @0 WHERE ([Id] = @1) -- @0: 'Green Eggs and Ham' (Type = String, Size = -1) -- @1: '1' (Type = Int32) -- Executing asynchronously at 10/8/2013 10:55:41 AM -07:00 -- Completed in 12 ms with result: 1 INSERT [dbo].[Posts]([Title], [BlogId]) VALUES (@0, @1) SELECT [Id] FROM [dbo].[Posts] WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity() -- @0: 'I do not like them!' (Type = String, Size = -1) -- @1: '1' (Type = Int32) -- Executing asynchronously at 10/8/2013 10:55:41 AM -07:00 -- Completed in 2 ms with result: SqlDataReader 

बाहरी फ़ाइल में प्रवेश करने के लिए:

 using (var context = new BlogContext()) { using (var sqlLogFile = new StreamWriter("C:\\temp\\LogFile.txt")) { context.Database.Log = sqlLogFile.Write; var blog = context.Blogs.First(b => b.Title == "One Unicorn"); blog.Posts.First().Title = "Green Eggs and Ham"; context.SaveChanges(); } } 

यहां अधिक जानकारी: लॉगिंग और इंटरसेप्टिंग डाटाबेस संचालन

खैर, मैं उस प्रयोजन के लिए एक्सप्रेस प्रोफाइलर का उपयोग कर रहा हूं, इस पर दोष यह है कि यह केवल एमएस SQL ​​सर्वर के लिए काम करता है आप इस टूल को यहां पा सकते हैं: https://expressprofiler.codeplex.com/

 IQueryable query = from x in appEntities where x.id = 32 select x; var queryString = query.ToString(); 

एसक्यूएल क्वेरी लौटाएगा। EntityFramework 6 के डेटाकॉन्टेक्स्ट का उपयोग कर कार्य करना

क्वेरी हमेशा काम करने के लिए, कोड बदलने के बिना इसे अपने DbContext में जोड़ें और इसे दृश्य स्टूडियो में आउटपुट विंडो पर चेक करें।

  protected override void OnModelCreating(DbModelBuilder modelBuilder) { Database.Log = (query)=> Debug.Write(query); } 

@ मैट नीबीकर के उत्तर के समान, लेकिन इसके साथ आपको इसे अपने वर्तमान कोड में जोड़ना नहीं पड़ता है, जब भी आपको क्वेरी की आवश्यकता होती है

ईएफ 6+ के लिए मेरे मामले में, क्वेरी स्ट्रिंग ढूंढने के लिए तत्काल विंडो में इसका उपयोग करने की बजाय:

 var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query).ToTraceString(); 

उत्पन्न SQL कमांड प्राप्त करने के लिए इसका उपयोग करने के लिए समाप्त हुआ:

 var sql = ((System.Data.Entity.Infrastructure.DbQuery<<>f__AnonymousType3<string,string,string,short,string>>)query).ToString(); 

बेशक आपका गुमनाम टाइप हस्ताक्षर अलग हो सकता है

HTH।

मेरा जवाब ईएफ कोर के पते, (जैसा कि कुछ टिप्पणीकारों ने सबसे अधिक वोट वाले उत्तर "ईएफ कोर विकल्प क्या है?"

इस गिथूब मुद्दे में संदर्भित डॉक्स से लिया गया :

जब आपके डीबीसीओन्टेक्स्ट को विन्यस्त किया जाता है, तो आप DbContextOptionsBuilder.UseLoggerFactory

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var lf = new LoggerFactory(); lf.AddProvider(new MyLoggerProvider()); optionsBuilder.UseLoggerFactory(lf); } 

आपके पास LoggerFactory लिए दो विकल्प हैं:

  1. अपने नए प्रदाता के साथ अपने आप को जोड़ने, नए LoggerFactory() करें उपरोक्त उदाहरण में, MyLoggerProvider , उस वर्ग की परिभाषा के लिए लिंक देखें)

  2. आपके कोड की निर्भरता-इंजेक्शन ILoggerFactory तक पहुंच हो सकती है। मेरे मामले में, मैं AddDbContext , Configure() अंदर उपयोग किया था Configure() में इस बिंदु पर, दायरे में कोई निर्भरता-इंजेक्शन ILoggerFactory नहीं था, इसलिए मैं इस तकनीक का उपयोग नहीं कर सका।

MyLoggerProvider (पहली तकनीक से) के कार्यान्वयन यहां है:

 public class MyLoggerProvider : ILoggerProvider { public ILogger CreateLogger(string categoryName) { return new MyLogger(); } public void Dispose() { } private class MyLogger : ILogger { public bool IsEnabled(LogLevel logLevel) { return true; } public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { File.AppendAllText(@"C:\temp\log.txt", formatter(state, exception)); Console.WriteLine(formatter(state, exception)); } public IDisposable BeginScope<TState>(TState state) { return null; } } } 

मैंने यह किया है:

 IQueryable<Product> query = EntitySet.Where(p => p.Id == id); Debug.WriteLine(query); 

और परिणाम आउटपुट में दिखाया गया है:

 SELECT [Extent1].[Id] AS [Id], [Extent1].[Code] AS [Code], [Extent1].[Name] AS [Name], [Extent2].[Id] AS [Id1], [Extent2].[FileName] AS [FileName], FROM [dbo].[Products] AS [Extent1] INNER JOIN [dbo].[PersistedFiles] AS [Extent2] ON [Extent1].[PersistedFileId] = [Extent2].[Id] WHERE [Extent1].[Id] = @p__linq__0 

मेरे लिए, ईएफ 6 और विजुअल स्टूडियो 2015 का उपयोग करके मैंने तत्काल विंडो में query दर्ज किया और उसने मुझे उत्पन्न एसक्यूएल स्टेटमेंट दिया

यदि आप पैरामीटर मान चाहते हैं (न केवल @p_linq_0 बल्कि उनके मान भी), तो आप IDbCommandInterceptor उपयोग कर सकते हैं और ReaderExecuted विधि के लिए कुछ लॉगिंग जोड़ सकते हैं।