2011-12-26 3 views
4

SQLCE4データベースでEntity Frameworkコードの最初のアプローチを使用したいと考えています。すべてが本当にいいようですが、私はSQLクエリのデバッグに問題があります。私はhttp://efwrappers.codeplex.com/からのEFTracingが私が必要とするものでなければならないが、私はapp.configファイルなしでそれを使用する方法を知らないことがわかった。私はこの構成の大ファンではない。私はすべてのC#コードを使用して実行したいと思っています。私は、このようなコードを使用するとうまくいくはずです:Entity Framework構成ファイルのないトレースプロバイダのラッパー

using (System.Data.Common.DbConnection c = 
    new EFTracingProvider.EFTracingConnection(
     new System.Data.SqlServerCe.SqlCeConnection(conn))) 
{ 
    using (var context = new MyContext(c)) 
    { 
     var a = from data in context.Projects select data; 
    } 
} 

しかし、それは動作しません。これは、例外をスロー:

タイプ EFTracingProvider.EFTracingConnection」の接続のためにプロバイダ名を判別できません。

コードでのみラップされた接続を正しく作成する方法はありますか?

答えて

6

ソリューションは、DbContextオブジェクトを以下の通りです。

public class MyContext : DbContext 
{ 
    public MyContext() 
    : base(CreateConnection("Data Source=file.sdf", 
          "System.Data.SqlServerCe.4.0"), true) 
    { } 

    public DbSet<Project> Projects { get; set; } 

    public static bool TraceEnabled = true; 

    private static DbConnection CreateConnection(string connectionString, 
               string providerInvariantName) 
    { 
    DbConnection connection = null; 
    if (TraceEnabled) 
    { 
     EFTracingProviderConfiguration.RegisterProvider(); 
     EFTracingProviderConfiguration.LogToConsole = true; 
     string wrapperConnectionString = String.Format(@"wrappedProvider={0};{1}", 
     providerInvariantName, connectionString); 
     connection = new EFTracingConnection() 
     { 
     ConnectionString = wrapperConnectionString 
     }; 
    } 
    else 
    { 
     DbProviderFactory factory = DbProviderFactories.GetFactory(providerInvariantName); 
     connection = factory.CreateConnection(); 
     connection.ConnectionString = connectionString; 
    } 
    return connection; 
    } 
} 

は、だから今、私はちょうどコンテキストとの接続を使用することができますTraceEnabled性質に応じて、ラップや開封SQLCEのために自動的に作成されます。

using (var context = new MyContext()) 
{ 
    var a = context.Projects.FirstOrDefault(); 
} 
+0

これは移行の一部としては機能していないようです。私はその解決策を探しています。 – aikeru

0

SQLクエリをトレースするための本物の方法は、そのようなToStringメソッドを呼び出すことです:

var t = from c in _entities.CompanyDetail 
     select c; 

string test = t.ToString(); 

私はEFTracingを知らないが、あなたはMVCMiniProfilerをしようとする場合があります。 MVCMiniProfilerという名前にもかかわらず、SQLクエリのプロファイリングと設定ファイルなしの作業が可能です。

+0

悪い編集で申し訳ありませんが、私は携帯電話から回答しています。ありがとうUweの助けを求めるkeim –

+0

MVCMiniProfilerありがとう。それは本当に役に立つかもしれません。 –

0

私はこれを、ObjectContextの周りにラッパークラスを作成し、元のコンテキストの代わりにそのラッパーを使用して作成しました。

また、トレース出力メソッドを定義し、トレースを初期化する静的メソッドがあります。ここでは:

public static class EFTracingExtensions 
{ 
    private static ILogger _logger; 

    public static void InitSqlTracing(ILogger logger) 
    { 
     _logger = logger; 

     EFTracingProviderConfiguration.RegisterProvider(); 

     if (logger.IsLoggingEnabled())   // Don't add logging hooks if logging isn't enabled 
     { 
      EFTracingProviderConfiguration.LogAction = new Action<CommandExecutionEventArgs>(AppendSqlLog); 
     } 
    } 

    private static void AppendSqlLog(CommandExecutionEventArgs e) 
    { 
     if (e.Status != CommandExecutionStatus.Executing)    // we only care about Finished and Failed 
     { 
      StringBuilder msg = new StringBuilder(e.ToTraceString().TrimEnd()); 
      msg.Append(Environment.NewLine); 
      if (e.Result is SqlDataReader) 
      { 
       int rows = ((SqlDataReader)e.Result).HasRows ? ((SqlDataReader)e.Result).RecordsAffected : 0; 
       msg.AppendFormat("*** {0} rows affected", rows); 
      } 
      else if (e.Result is int) 
      { 
       msg.AppendFormat("*** result: {0}", e.Result); 
      } 
      else 
      { 
       msg.AppendFormat("*** finished, result: {0}", e.Result); 
      } 

      msg.Append(Environment.NewLine); 
      msg.AppendFormat(" [{0}] [{1}] in {2} seconds", e.Method, e.Status, e.Duration); 
      _logger.Log(msg.ToString(), LoggerCategories.SQL); 
     } 
    } 
} 

ILoggerは私が使用しているロギングインターフェイスです。独自のインターフェース/メソッドを置き換える必要があります。

プログラムの起動時にInitSqlTracingメソッドが呼び出され、LoggedContextクラスを使用してEntity Frameworkによって生成されたすべてのSQLがログに記録されます。

はあなたのサンプルコードと一緒にすべてを置く:私の問題のため

EFTracingExtensions.InitSqlTracing(logger); // only call this once 

using (var context = new LoggedContext()) 
{ 
    var a = from data in context.Projects select data; 
} 
+0

私はコードの最初のアプローチを使用しているので、DbContextではなくObjectContextがあるので、少し違ったものが必要です。 –

関連する問題