zoukankan      html  css  js  c++  java
  • 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语句了。实在是方便极了。

  • 相关阅读:
    linux设备驱动学习笔记(1)
    linux 设备驱动程序中的一些关联性思考
    linux——(2)文件权限与目录配置
    linux——(1)初识linux
    设计模式-状态模式(State Pattern)
    设计模式-组合模式(Composite Pattern)
    设计模式-迭代器模式(Iterator Pattern)
    设计模式-模板方法模式(the Template Method Pattern)
    设计模式-外观模式(Facade Pattern)
    设计模式-适配器模式(Adapter Pattern)
  • 原文地址:https://www.cnblogs.com/njl041x/p/4397980.html
Copyright © 2011-2022 走看看