2011-04-26 132 views

回答

12

是的,你可以。我将community version与数据库优先DbContexts和代码优先DbContexts结合使用。此答案基于项目网站上的discussion thread

对于数据库一/设计师DbContexts(通过ADO.NET DbContext Generator templates),你可以简单地添加下面的构造:

public abstract class MyDbContext : DbContext 
{ 
    protected MyDbContext(string nameOrConnectionString) 
     : base(EFTracingProviderUtils.CreateTracedEntityConnection(nameOrConnectionString), true) 
    { 
     // enable sql tracing 
     ((IObjectContextAdapter) this).ObjectContext.EnableTracing(); 
    } 
} 

对于代码,因为EFTracingProvider想要一个完整的实体连接字符串第一DbContexts它有点复杂。您必须手动创建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; 
    } 
} 
+1

我有一些问题与上面的,但是这是一个非常可行的解决方案和jrummell通过将解决方案发布到问题最难的部分为我节省了时间。有关这方面的更多信息可以在codeplex上的讨论中找到:http://efwrappers.codeplex.com/discussions/262707 – 2011-08-13 21:58:30

+0

jrummel:非常感谢您的帮助,我终于可以使用4.1而不是4.0 :-) – eka808 2011-09-06 08:33:48

+1

在我看来,RTPeat提到的Clutch Tracer比跳过所有这些篮球要简单得多。在尝试Clutch Tracer和Clutch Tracer在10分钟内工作之前,我浪费了一整天的时间。 – 2013-06-22 20:04:21

5

如果您正在使用的DbContext和MVC模型首先,使用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命令。当启用跟踪时,我绕过数据库初始化,

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) 
    { 

    } 
} 
+5

这是一个救星。非常感谢。对于那些有兴趣的人,你甚至不一定需要创建一个DbTracingListener。你也可以做一些简单的事情:'Clutch.Diagnostics.EntityFramework.DbTracing.Enable(new GenericDbTracingListener()。OnFinished(c => Log(c.Command.ToTraceString())));'Log是什么您写入的函数来记录Sql文本。我把它放在WCF数据服务项目的实体(即DbContext)类的构造函数中,并且工作正常。 – 2013-06-22 20:01:07