2011-04-26 8 views

उत्तर

12

हाँ, आप कर सकते हैं। मैं community version का उपयोग डेटाबेस-पहले डीबी कॉन्टैक्स और कोड-प्रथम डीबी कॉन्टैक्स दोनों के साथ कर रहा हूं। यह उत्तर प्रोजेक्ट साइट पर discussion thread पर आधारित है।

डेटाबेस पहले/डिजाइनर DbContexts के लिए (ADO.NET DbContext Generator templates के माध्यम से), तो आप बस निम्नलिखित निर्माता जोड़ सकते हैं:

public abstract class MyDbContext : DbContext 
{ 
    protected MyDbContext(string nameOrConnectionString) 
     : base(EFTracingProviderUtils.CreateTracedEntityConnection(nameOrConnectionString), true) 
    { 
     // enable sql tracing 
     ((IObjectContextAdapter) this).ObjectContext.EnableTracing(); 
    } 
} 

कोड के लिए पहले अपने में थोड़ा और अधिक जटिल DbContexts के बाद से EFTracingProvider एक पूर्ण इकाई कनेक्शन स्ट्रिंग चाहता है। आपको मैन्युअल रूप से EFTracingConnection का एक उदाहरण बनाना होगा। निम्न उदाहरण डेटाबेस दोनों के लिए पहले और कोड पहले संदर्भों के लिए काम करेगा।

public abstract class MyDbContext : DbContext 
{ 
    protected MyDbContext(string nameOrConnectionString) 
     : base(CreateTracingConnection(nameOrConnectionString), true) 
    { 
     // enable sql tracing 
     ((IObjectContextAdapter) this).ObjectContext.EnableTracing(); 
    } 

    private static DbConnection CreateTracingConnection(string nameOrConnectionString) 
    { 
     try 
     { 
      // this only supports entity connection strings http://msdn.microsoft.com/en-us/library/cc716756.aspx 
      return EFTracingProviderUtils.CreateTracedEntityConnection(nameOrConnectionString); 
     } 
     catch (ArgumentException) 
     { 
      // an invalid entity connection string is assumed to be a normal connection string name or connection string (Code First) 

      ConnectionStringSettings connectionStringSetting = 
       ConfigurationManager.ConnectionStrings[nameOrConnectionString]; 
      string connectionString; 
      string providerName; 

      if (connectionStringSetting != null) 
      { 
       connectionString = connectionStringSetting.ConnectionString; 
       providerName = connectionStringSetting.ProviderName; 
      } 
      else 
      { 
       providerName = "System.Data.SqlClient"; 
       connectionString = nameOrConnectionString; 
      } 

      return CreateTracingConnection(connectionString, providerName); 
     } 
    } 

    private static EFTracingConnection CreateTracingConnection(string connectionString, string providerInvariantName) 
    { 
     // based on the example at http://jkowalski.com/2010/04/23/logging-sql-statements-in-entity-frameworkcode-first/ 
     string wrapperConnectionString = 
      String.Format(@"wrappedProvider={0};{1}", providerInvariantName, connectionString); 

     EFTracingConnection connection = 
      new EFTracingConnection 
       { 
        ConnectionString = wrapperConnectionString 
       }; 

     return connection; 
    } 
} 
+1

मैं ऊपर के साथ कुछ मुद्दों था, लेकिन यह एक बहुत ही व्यावहारिक है समाधान और jrummell समस्या के सबसे कठिन हिस्से में समाधान पोस्ट करके मुझे समय के टन बचाया। इसके बारे में अधिक जानकारी यहां कोडप्लेक्स पर चर्चा ट्रेड पर पाई जा सकती है: http://efwrappers.codeplex.com/discussions/262707 –

+0

jrummel: वास्तव में आपकी मदद के लिए धन्यवाद, मैं अंत में 4.0 के बजाय 4.1 का उपयोग कर सकता हूं :-) – eka808

+1

मेरी राय में आरटीपीएट द्वारा उल्लिखित क्लच ट्रैसर इन सभी हुप्स के माध्यम से कूदने से कहीं अधिक सरल है। मैंने क्लच ट्रैसर की कोशिश करने से पहले पूरे दिन बर्बाद कर दिया और क्लच ट्रैसर 10 मिनट में काम कर रहा था। –

5

आप DBContext और MVC मॉडल सबसे पहले उपयोग कर रहे हैं, तो EntityConnections का उपयोग कर निम्न नमूना कोड होना चाहिए जिसका अर्थ है आप सभी की जरूरत:

public partial class BrickHouseFitnessContext : DbContext 
{ 

    public BrickHouseFitnessContext(): base(EntityConnectionWrapperUtils.CreateEntityConnectionWithWrappers(ConfigurationManager.ConnectionStrings["BrickHouseFitnessContext"].ConnectionString, "EFTracingProvider"), true) 
    { 
    } 
इसके अलावा

:

Web.config फ़ाइल में निम्न अनुभाग जोड़ें:

<system.data> 
<DbProviderFactories> 
    <add name="EF Tracing Data Provider" invariant="EFTracingProvider" description="Tracing Provider Wrapper" type="EFTracingProvider.EFTracingProviderFactory, EFTracingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" /> 
    <add name="EF Generic Provider Wrapper" invariant="EFProviderWrapper" description="Generic Provider Wrapper" type="EFProviderWrapperToolkit.EFProviderWrapperFactory, EFProviderWrapperToolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" /> 
</DbProviderFactories> 

और:

<add key="EFTracingProvider.logToConsole" value="true" /> 
<add key="EFTracingProvider.logToFile" value="C:\BrickHouseFitnessSqlLog.txt" /> 

ExtendedEntities या अन्य ObjectContext व्युत्पन्न वर्ग मूल लेख में उल्लेख किया है शामिल करने के लिए कोई जरूरत नहीं है। उस कोड को चलाएं और आपको निर्दिष्ट रूप में अपनी SQL फ़ाइल को सभी SQL आदेशों के साथ देखना चाहिए। मैं डेटाबेस intialization को दरकिनार कर रहा हूँ जब ट्रेसिंग सक्षम है,

12

जबकि पिछले जवाब काम करते हैं, मैं उन्हें समस्याग्रस्त पाई है तो बहुत सरल समाधान पर्दे के पीछे MiniProfiler का उपयोग करता है NuGet से Clutch.Diagnostics.EntityFramework पैकेज का उपयोग करने के लिए है। EFTracingProvider से काम करने के लिए यह काफी आसान है, और एक बहुत अधिक लचीला समाधान है।

परियोजना कार्यक्षमता NuGet पैकेज स्थापित और फिर इस तरह IDbTracingListener लागू की तरह https://github.com/Kukkimonsuta/Clutch

EFTracingProvider के लिए कम से GitHub पर है:

using System; 
using System.Data.Common; 
using System.Diagnostics; 
using Clutch.Diagnostics.EntityFramework; 

/// <summary> 
/// 
/// </summary> 
public class DbTracingListener : IDbTracingListener 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="connection"></param> 
    /// <param name="command"></param> 
    /// <param name="result"></param> 
    /// <param name="duration"></param> 
    public void CommandExecuted(DbConnection connection, DbCommand command, object result, TimeSpan duration) 
    { 
     Debug.WriteLine(command.CommandText); 
     Debug.WriteLine(string.Format("Executed in: {0}", duration)); 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="connection"></param> 
    /// <param name="command"></param> 
    public void CommandExecuting(DbConnection connection, DbCommand command) 
    { 

    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="connection"></param> 
    /// <param name="command"></param> 
    /// <param name="exception"></param> 
    /// <param name="duration"></param> 
    public void CommandFailed(DbConnection connection, DbCommand command, Exception exception, TimeSpan duration) 
    { 

    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="connection"></param> 
    /// <param name="command"></param> 
    /// <param name="result"></param> 
    /// <param name="duration"></param> 
    public void CommandFinished(DbConnection connection, DbCommand command, object result, TimeSpan duration) 
    { 

    } 
} 
+5

यह एक lifesaver था। बहुत बहुत धन्यवाद। रुचि रखने वालों के लिए, आपको एक डीबीट्रिसिंग लिस्टर बनाने की भी आवश्यकता नहीं है।आप बस कुछ भी सरल कर सकते हैं: 'क्लच। डायग्नोस्टिक्स.इन्टिटीफ्रेमवर्क। डीबीट्रैसिंग। सक्षम (नया जेनेरिक डीबीट्रैसिंग लिस्टनर()। ऑनफिनिश (सी => लॉग (सी। कॉमांड। टट्रेसस्ट्रिंग()));' जहां लॉग जो कुछ भी है एसक्यूएल टेक्स्ट लॉग करने के लिए आप लिखते हैं। मैंने इसे डब्ल्यूसीएफ डाटा सर्विसेज प्रोजेक्ट के लिए अपनी संस्थाओं (यानी डीबीकॉन्टेक्स्ट) कक्षा के निर्माता में रखा है और यह ठीक काम कर रहा है। –

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