2011-04-26 129 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