实体框架4.1 - EFTracingProvider

eka*_*808 8 c# ef-code-first entity-framework-4.1

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

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

提前致谢!

jru*_*ell 12

是的你可以.我正在使用社区版本,包括数据库优先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();
    }
}
Run Code Online (Sandbox Code Playgroud)

对于代码,首先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;
    }
}
Run Code Online (Sandbox Code Playgroud)


RTP*_*eat 12

虽然之前的答案有效,但我发现它们存在问题,更简单的解决方案是使用NuGet的Clutch.Diagnostics.EntityFramework包,它在幕后使用MiniProfiler.与EFTracingProvider相比,它的工作要简单得多,而且解决方案更加灵活.

该项目位于GitHub,网址https://github.com/Kukkimonsuta/Clutch

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

using System;
using System.Data.Common;
using System.Diagnostics;
using Clutch.Diagnostics.EntityFramework;

/// <summary>
/// 
/// </summary>
public class DbTracingListener : IDbTracingListener
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="connection"></param>
    /// <param name="command"></param>
    /// <param name="result"></param>
    /// <param name="duration"></param>
    public void CommandExecuted(DbConnection connection, DbCommand command, object result, TimeSpan duration)
    {
        Debug.WriteLine(command.CommandText);
        Debug.WriteLine(string.Format("Executed in: {0}", duration));
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="connection"></param>
    /// <param name="command"></param>
    public void CommandExecuting(DbConnection connection, DbCommand command)
    {

    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="connection"></param>
    /// <param name="command"></param>
    /// <param name="exception"></param>
    /// <param name="duration"></param>
    public void CommandFailed(DbConnection connection, DbCommand command, Exception exception, TimeSpan duration)
    {

    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="connection"></param>
    /// <param name="command"></param>
    /// <param name="result"></param>
    /// <param name="duration"></param>
    public void CommandFinished(DbConnection connection, DbCommand command, object result, TimeSpan duration)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是救星.非常感谢.对于那些感兴趣的人,您甚至不必创建DbTracingListener.你也可以做一些简单的事情:`Clutch.Diagnostics.EntityFramework.DbTracing.Enable(new GenericDbTracingListener().OnFinished(c => Log(c.Command.ToTraceString())));`其中Log是无论什么您编写的函数用于记录Sql文本.我把它放在我的实体(即DbContext)类的构造函数中,用于WCF数据服务项目,它工作正常. (5认同)

小智 5

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

    public partial class BrickHouseFitnessContext : DbContext
{

    public BrickHouseFitnessContext(): base(EntityConnectionWrapperUtils.CreateEntityConnectionWithWrappers(ConfigurationManager.ConnectionStrings["BrickHouseFitnessContext"].ConnectionString, "EFTracingProvider"), true)
    {
    }
Run Code Online (Sandbox Code Playgroud)

也:

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

  <system.data>
<DbProviderFactories>
  <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>
Run Code Online (Sandbox Code Playgroud)

和:

    <add key="EFTracingProvider.logToConsole" value="true" />
<add key="EFTracingProvider.logToFile" value="C:\BrickHouseFitnessSqlLog.txt" />
Run Code Online (Sandbox Code Playgroud)

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