Asp.net MVC4 CodeFirst 使用EFTracingProvider

一、关于EFTracingProvider

EFTracingProvider相关信息见作者博客:关于EFTracingProvider

EFTracingProvider Demo下载地址:Tracing and Caching Provider Wrappers for Entity Framework 4

EFTracingProvider 相关问题讨论:DISCUSSIONS

EFTracingProvider Nuget安装:Entity Framework Tracing Provider 1.0.0

二、如何在CodeFirst模式下使用EFTracingProvider

通过查阅的资料发现,给出的EFTracingProvider示例大都是在模型优先的模式下使用的,少有代码优先模式下的例子,不过好在在(DISCUSSIONS)里发现了答案。

现将CodeFirst模式下的使用方法做一总结,以供参考。

1、Web.config配置,添加如下配置。

  <appSettings>

	<!--turn on/off EFTracing-->
	<add key="EFTracingProvider:Enabled" value="true" />
	<!-- write log messages to the console. -->
	<add key="EFTracingProvider.logToConsole" value="false" />
	<!-- append log messages to the specified file -->
	<add key="EFTracingProvider.logToFile" value="E:\sqllog.txt" />
	  
  </appSettings>
  <system.data>
	<DbProviderFactories>
		<add name="EF Caching Data Provider" invariant="EFCachingProvider" description="Caching Provider Wrapper" type="EFCachingProvider.EFCachingProviderFactory, EFCachingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
		<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>
  </system.data>

2、Global文件配置,在Application_Start()中添加如下代码:

            //当启用EFTracingProvider时,不进行初始化数据库
            if (string.Equals(ConfigurationManager.AppSettings["EFTracingProvider:Enabled"], "true", StringComparison.InvariantCultureIgnoreCase))
            {
                Database.SetInitializer<JYZSContext>(null);
                JYZSContext.TraceEnabled = true;
            }
            else
            {
                Database.SetInitializer<JYZSContext>(new JYZSInitializer());
            }

3、修改你的DbContext,主要是将构造函数中的DbConnection类型链接改为TracingConnection类型的链接。

        #region Trace Mechanics

        public static bool TraceEnabled = false;

        public JYZSContext() : this("JYZSConnection") { }

        public JYZSContext(string nameOrConnectionString)
            : base(CreateConnection(nameOrConnectionString), true)
        {
            if (TraceEnabled)
            {
                ((IObjectContextAdapter)this).ObjectContext.EnableTracing();
            }
        }

        private static DbConnection CreateConnection(string nameOrConnectionString)
        {
            EFTracingProviderFactory.Register();

            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 CreateConnection(connectionString, providerName);
        }

        private static DbConnection CreateConnection(string connectionString, string providerInvariantName)
        {
            DbConnection connection = null;
            if (TraceEnabled)
            {
                connection = CreateTracingConnection(connectionString, providerInvariantName);
            }
            else
            {
                DbProviderFactory factory = DbProviderFactories.GetFactory(providerInvariantName);
                connection = factory.CreateConnection();
                connection.ConnectionString = connectionString;
            }
            return connection;
        }

        private static EFTracingConnection CreateTracingConnection(string connectionString, string providerInvariantName)
        {

            string wrapperConnectionString =
                String.Format(@"wrappedProvider={0};{1}", providerInvariantName, connectionString);

            EFTracingConnection connection =
                new EFTracingConnection
                {
                    ConnectionString = wrapperConnectionString
                };
            //hook up logging here
            connection.CommandFinished +=
                (sender, args) => Console.WriteLine(args.ToTraceString());
            
            return connection;
        }

        #endregion

三、总结说明

以上代码是在我的项目中整理出来的,使用时注意修改链接字符串名称,并根据你的需要修改配置。

以代码中配置为例,当运行程序时,就可以在 E:\sqllog.txt 查看到EF生成的SQL语句了。实在是方便极了。

posted @ 2015-04-07 12:45  i迷倪  阅读(945)  评论(0编辑  收藏  举报