Entity Framework 4.1 - EFTracingProvider

前端 未结 3 630
迷失自我
迷失自我 2020-12-07 23:47

Is there a way to make the EFTracing provider work with EF 4.1?

EFTracing seems to need an objectcontext and I use dbcontext.

Thanks in advance!

3条回答
  •  我在风中等你
    2020-12-08 00:23

    Yes, you can. I'm using the community version with both database-first DbContexts and code-first DbContexts. This answer is based on a discussion thread on the project site.

    For database-first/designer DbContexts (via ADO.NET DbContext Generator templates), you can simply add the following constructor:

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

    For code first DbContexts its a bit more complicated since the EFTracingProvider wants a full entity connection string. You have to create an instance of EFTracingConnection manually. The following example will work for both database first and code first contexts.

    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;
        }
    }
    

提交回复
热议问题