2012-02-27 10 views
5

私はmvc3プロジェクトで最初にEF 4.2コードを使用します。MiniProfiler、EntityFrameworkコードの最初とバックグラウンドタスクnullreference

miniprofilerはうまく機能しますが(SQL + MVC)、非同期タスクに関する問題があります。

私はのApplication_Startで適切なラインを持っている

public static void PerformAsycAction(this User user, Action<User> action) 
{ 
    ThreadPool.QueueUserWorkItem(_ => 
    { 
    var context = new DatabaseContext(); 
    MiniProfilerEF.Initialize(); 
    var consistantUser = context.Set<User>().Get(user.Id); 
    action(consistantUser); 
    context.SaveChanges(); 
    }); 
} 

が、私はこのnew DatabaseContext()で少し不安を感じて[OK]をこの方法で?)「日をこのように実行します。

protected void Application_Start() 
    { 
     MiniProfilerEF.Initialize(); 
     ... 
    } 

exc30は、最初の操作中にdbでaction(consistantUser); にスローされます。ここにトレースがあります。

MvcMiniProfiler.MiniProfiler.AddSqlTimingで

(SqlTiming統計)はC:\ユーザーは、SAM \デスクトップ\ MVC-ミニプロファイラ\ MvcMiniProfiler \ MiniProfiler.cs:\ MvcMiniProfiler.SqlTiming..ctor(でライン274 をされたDbCommandコマンド、ExecuteType C:\ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ SqlTiming.cs内の137: のMvcMiniProfiler.SqlProfiler.ExecuteStartImpl(DbCommandコマンド、ExecuteTypeタイプ)のC:\ Users \ samにあります。 \ Users \ sam \ Desktop \ mvc-mini-profiler \ mvc-mini-profiler \ MvcMiniProfiler \ SqlProfiler.cs:行39 MvcMiniProfiler.SqlProfilerExtensions.ExecuteStart(SqlProfiler sqlProfiler、DbCommandコマンド、ExecuteTypeタイプ) MvcMiniProfiler.MiniProfiler.MvcMiniProfiler.Data.IDbProfiler.ExecuteStart(DbCommand profiledDbCommand、Exe)のMvcMiniProfiler \ SqlProfiler.cs:行93 MvcMiniProfiler \ MiniProfiler.IDbProfiler.cs:行14 at MvcMiniProfiler.Data.ProfiledDbCommand.ExecuteDbDataReader(CommandBehaviorビヘイビア)(C:\ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ Data \ ProfiledDbCommand.cs:行158 at System.Data.Common.DbCommand.ExecuteReader(CommandBehaviorビヘイビア) at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand、CommandBehaviorビヘイビア) )

私は間違っていますか? 助けていただければ幸いです。

EDIT:私はbackgroungタスクが(DatabaseContextを開始する前に)performdれるスレッドで、再びMiniProfiler(MiniProfilerEF.Initialize();)を初期化しようとした、そして今、別の例外があります:

のオブジェクトをキャストすることができませんが実際には「System.Data.SqlClient.SqlConnection

を入力するタイプ「MvcMiniProfiler.Data.EFProfiledDbConnection」は、それがバックグラウンドスレッドでクエリをプロファイリングする必要ありませんが、それクラッシュ全体のスレッド、アプリケーションが正常に動作しないように、私はプロファイラ全体を嫌う必要があります。それがクラッシュするのを防ぐために、それを無効にする方法はありますか?

+0

実際の例外は何ですか? –

+0

NullReferenceException –

+0

これらの関数のいずれにもNULLを渡していないことを検証しましたか? –

答えて

1

接続文字列がEntity Frameworkスタイルの接続文字列であるため、接続文字列にアクセスしようとするとコードが壊れます。

接続文字列をミニプロファイラに渡すときは、EF接続文字列から実際の接続文字列を抽出する必要があります。

EntityConnection connection = 
    new EntityConnection(ConfigurationManager 
        .ConnectionStrings["ConnectionStringName"].ConnectionString)); 

string connectionString = connection.StoreConnection.ConnectionString; 
関連する問題