13

EFCodeFirstでmvc-mini-profilerを使用しようとしています。DbProfiledConnectionを作成し、以下のように構築時にDbContextに渡します。アプリケーションは、SQLがプロファイラーに公開されていないため、期待どおりに動作し続けます。

public class WebContext : DbContext
{
    static DbConnection _connection = new SqlConnection(ConfigurationManager.ConnectionStrings["WebContext"].ConnectionString);
    static DbConnection _profiledConnection = MvcMiniProfiler.Data.ProfiledDbConnection.Get(_connection);        

    public WebContext()
            : base(_profiledConnection, true)
    {   

    }

おっと私の悪い。

WebContextがUnitOfWorkで構築されるときに、ProfiledDbConnectionを渡すように変更しました。

public UnitOfWork()
{             
    var profiledConnection = MvcMiniProfiler.Data.ProfiledDbConnection.Get(connection);
    this.context = new MyContext(profiledConnection);
}

チェックしたところ、MiniProfier CurrentがApplication_BeginRequestに設定されており、データベースにクエリを実行しようとするとProfiledDbConnectionが返され、ProfiledDbProviderServicesクラスでエラーがスローされます。

 protected override string GetDbProviderManifestToken(DbConnection connection)
 {
     return tail.GetProviderManifestToken(connection);
 }

このメソッドは、「プロバイダーがProviderManifestToken文字列を返しませんでした」を返します。エラー

4

1 に答える 1

7

これは静的フィールド初期化子に関連している思います。Webアプリの接続は、とにかく静的であってはなりません(ただし、せいぜいリクエスト固有です)。

重要なのは、ProfiledDbConnection実際には何が出てくるのかということです。このGetメソッドは、ProfiledDbConnection(現在のリクエストで)現在プロファイリングを行っている場合にのみを返し、接続はMiniProfilerそのリクエストのインスタンスに対してプロファイリングされます。

静的フィールドを使用する場合、2つのシナリオがあります。

  • 静的フィールドはリクエストコンテキスト(または開発者以外のリクエストコンテキスト)なしMiniProfiler.Currentで初期化されます: nullのようにプロファイリングは発生しません
  • 静的フィールドは初期化されますが、すべてが最初のリクエストに対してログに記録され、すぐに無効になります
于 2011-06-09T11:12:09.813 に答える