Entity Framework 4.1 - EFTracingProvider - PullRequest
       30

Entity Framework 4.1 - EFTracingProvider

8 голосов
/ 26 апреля 2011

Есть ли способ заставить поставщика EFTracing работать с EF 4.1?

Кажется, что для EFTracing требуется объектный контекст, и я использую dbcontext.

Заранее спасибо!

Ответы [ 3 ]

12 голосов
/ 28 ноября 2012

Несмотря на то, что предыдущие ответы работают, я считаю их проблематичными, гораздо более простым решением является использование пакета Clutch.Diagnostics.EntityFramework от NuGet, который использует 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)
    {

    }
}
12 голосов
/ 13 июля 2011

Да, вы можете.Я использую версию сообщества и с DbContexts, в первую очередь с базой данных, и с DbContexts с первым кодом.Этот ответ основан на обсуждении на сайте проекта.

Для DbContexts, созданного в первую очередь для базы данных (через шаблоны генератора ADO.NET DbContext ), вы можетепросто добавьте следующий конструктор:

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;
    }
}
5 голосов
/ 20 ноября 2012

Если вы используете DBContext и MVC Model First, что означает использование EntityConnections, тогда вам понадобится следующий пример кода:

    public partial class BrickHouseFitnessContext : DbContext
{

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

Также:

В файле 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>

и

    <add key="EFTracingProvider.logToConsole" value="true" />
<add key="EFTracingProvider.logToFile" value="C:\BrickHouseFitnessSqlLog.txt" />

Нет необходимости включать ExtendedEntities или другой производный класс ObjectContext, упомянутый в исходной статье. Запустите этот код, и вы должны увидеть свой файл журнала, как указано, со всеми командами SQL в нем. Я игнорирую инициализацию базы данных при включенной трассировке,

...