entity framework4.1 – EFTracingProvider

有没有办法让EFTracing提供程序与EF 4.1一起使用?

EFTracing似乎需要一个objectcontext,我使用dbcontext。

提前致谢!

是的你可以。 我正在使用社区版本 ,包括数据库优先DbContexts和代码优先DbContexts。 这个答案基于项目网站上的讨论主题 。

对于数据库优先/设计器DbContexts(通过ADO.NET DbContext Generator模板 ),您只需添加以下构造函数:

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

虽然之前的答案有效,但我发现它们存在问题,更简单的解决方案是使用NuGet的Clutch.Diagnostics.EntityFramework包,它在幕后使用MiniProfiler。 比EFTracingProvider更加简单易用,并且是一个更加灵活的解决方案。

该项目位于GitHub, url为https://github.com/Kukkimonsuta/Clutch

对于EFTracingProvider之类的function,安装NuGet包然后实现IDbTracingListener,如下所示:

 using System; using System.Data.Common; using System.Diagnostics; using Clutch.Diagnostics.EntityFramework; ///  /// ///  public class DbTracingListener : IDbTracingListener { ///  /// ///  ///  ///  ///  ///  public void CommandExecuted(DbConnection connection, DbCommand command, object result, TimeSpan duration) { Debug.WriteLine(command.CommandText); Debug.WriteLine(string.Format("Executed in: {0}", duration)); } ///  /// ///  ///  ///  public void CommandExecuting(DbConnection connection, DbCommand command) { } ///  /// ///  ///  ///  ///  ///  public void CommandFailed(DbConnection connection, DbCommand command, Exception exception, TimeSpan duration) { } ///  /// ///  ///  ///  ///  ///  public void CommandFinished(DbConnection connection, DbCommand command, object result, TimeSpan duration) { } } 

如果您正在使用DBContext和MVC Model First,这意味着使用EntityConnections,那么您应该只需要以下示例代码:

  public partial class BrickHouseFitnessContext : DbContext { public BrickHouseFitnessContext(): base(EntityConnectionWrapperUtils.CreateEntityConnectionWithWrappers(ConfigurationManager.ConnectionStrings["BrickHouseFitnessContext"].ConnectionString, "EFTracingProvider"), true) { } 

也:

在Web.Config文件中添加以下部分:

       

和:

    

不需要包含原始文章中提到的ExtendedEntities或其他ObjectContext派生类。 运行该代码,您应该看到指定的日志文件,其中包含所有SQL命令。 启用跟踪时,我绕过了数据库初始化,