• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Asp.netMVC4CodeFirst使用EFTracingProvider

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、关于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语句了。实在是方便极了。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NET中取得Repeater里的checkbox值发布时间:2022-07-10
下一篇:
ASP.NET页面之间传值的几种方式发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap