2012-02-18 11 views
6

MvcMiniProfilerをasp.net mvc + entity framewokプロジェクトに統合しようとしています。初めてのWebリクエストはすべてOKですが、他のリクエストでは例外が発生しています。MvcMiniProfilerタイプEFProfiledDbConnectionのオブジェクトをキャストできません

私のプロジェクトは、私はNU-取得からMvcMiniProfilerをインストール
MVC 3
エンティティフレームワーク4.1(DatabaseFirst + POCOジェネレータDbContext)
MvcMiniProfiler.dll 1.9.0.0
MvcMiniProfiler.EntityFramework.dll 1.9.1.0
です

web.configファイルに下に追加
protected void Application_BeginRequest() 
    { 
     if (Request.IsLocal) 
     { 
      MvcMiniProfiler.MiniProfiler.Start(); 
      MiniProfilerEF.Initialize();  
     } 
    } 

をGlobal.asaxのために以下を追加しました

<system.data> 
    <DbProviderFactories> 
     <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" /> 
     <add name="MvcMiniProfiler.Data.ProfiledDbProvider" invariant="MvcMiniProfiler.Data.ProfiledDbProvider" description="MvcMiniProfiler.Data.ProfiledDbProvider" type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler, Version=1.8.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" /> 
    </DbProviderFactories> 
    </system.data> 

は私が

System.InvalidCastException was unhandled by user code 
    Message=Unable to cast object of type 'MvcMiniProfiler.Data.EFProfiledDbConnection' to type 'System.Data.SqlClient.SqlConnection'. 
    Source=System.Data 
    StackTrace: 
     at System.Data.SqlClient.SqlCommand.set_DbConnection(DbConnection value) 
     at System.Data.Common.DbCommand.set_Connection(DbConnection value) 
     at MvcMiniProfiler.Data.ProfiledDbCommand.set_DbConnection(DbConnection value) in C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\Data\ProfiledDbCommand.cs:line 118 
     at System.Data.Common.DbCommand.set_Connection(DbConnection value) 
     at System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState(EntityCommand entityCommand, EntityTransaction entityTransaction, DbCommand storeProviderCommand) 
     at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) 
     at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) 


例外はEFで発生しているこの例外を私は1.8からのWeb.ConfigにMvcMiniProfiler.Data.ProfiledDbProviderのバージョンを変更した場合

ModaEntitiesWrapper.GetInstance().Articles 
       .AsNoTracking() 
       .Where(p => p.StatusId == 1).ToList(); 

コールを取得しています.0.0〜1.9.0.0 MiniProfilerEF.Initialize()呼び出しで新しいタイプの例外が発生しました。

System.IndexOutOfRangeException was unhandled by user code 
    Message=The given DataRow is not in the current DataRowCollection. 
    Source=System.Data 
    StackTrace: 
     at System.Data.DataRowCollection.Remove(DataRow row) 
     at MvcMiniProfiler.MiniProfilerEF.Initialize() 

答えて

4

http://code.google.com/p/mvc-mini-profiler/

をチェックしてください。ここEFデータベース初とMVC-ミニプロファイラを使用する方法の例です:

public static class Entities 
{ 
    public static MyEntities Create() 
    { 
     var builder = new EntityConnectionStringBuilder(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString); 
     var sqlConnection = new SqlConnection(builder.ProviderConnectionString); 
     var profiledConnection = new EFProfiledDbConnection(sqlConnection, MiniProfiler.Current); 

     return profiledConnection.CreateObjectContext<MyEntities>(); 
    } 
} 

あなたはその後、使用してIOCのコンテナを使用してエンティティを登録することができますメソッドを使用するか、代わりに次のようなものを使用します。

using(var entities = Entities.Create()) 
{ 
    //Do stuff here 
    entities.SaveChanges(); 
} 

編集:忘れてしまったo add

MiniProfilerEF.Initialize();

これはEFコードファーストでのみ使用されます。

+0

+1便利な答えはちょうど私があなたのソリューションを試してみましたが、今、私は System.NotSupportedException以下のような別の例外を取得していますあなたの 'Create'サンプル – BrokenGlass

+0

にマイナーなバグを修正しましたタイプ 'MvcMiniProfiler.Data.EFProfiledDbConnection'の。 System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInvariantName(たDbConnection接続)613588 System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInfo(たDbConnection接続、DbProviderManifest&providerManifest)+57 System.Data.Entity。 DbModelBuilder。Build(DbConnection providerConnection)+159 – Yucel

+0

Hey Yucel、あなたのプロジェクトにEntity Frameworkをインストール/参照し、MvcMiniProfilerに追加する必要があります。また、Entity Frameworkパッケージが必要です。 EntityConnectionStringBuilderは、EF固有のメタデータでEntity Framework接続文字列を解析します。 ProviderConnectionStringは、(name、connectionString + provider)に使用されているものです。内部的にADO.NETには、接続文字列のプロバイダ属性に基づいて正しいプロバイダをインスタンス化する登録プロバイダを持つファクトリがあります。たとえば、MSSQL接続では通常、SqlClientプロバイダが使用されます。 – Shelakel

6

おそらくこれが役立ちます。 MiniProfilerEF.Initialize();をメソッドApplication_Start()の先頭に移動します。 EF 4.1以降では、呼び出されるメソッドはMiniProfilerEF.Initialize_EF42();でなければならないことに注意してください。接続のためのプロバイダ名を判別できません: -

protected void Application_Start() { 
    Logger.Info("Application start"); 
    MiniProfilerEF.Initialize_EF42(); 
    // ... 
} 
関連する問題