2012-02-18 45 views
6

我正在嘗試將MvcMiniProfiler集成到我的asp.net mvc + entity framewok項目中。第一次網絡請求一切正常,但它在其他請求中給予例外。MvcMiniProfiler無法投射EFProfiledDbConnection類型的對象

我的項目是
MVC 3
實體框架4.1(DatabaseFirst + POCO發電機的DbContext)
MvcMiniProfiler.dll 1.9.0.0
MvcMiniProfiler.EntityFramework.dll 1.9.1.0
我從安裝MvcMiniProfiler怒江獲取

下面添加到Global.asax中

protected void Application_BeginRequest() 
    { 
     if (Request.IsLocal) 
     { 
      MvcMiniProfiler.MiniProfiler.Start(); 
      MiniProfilerEF.Initialize();  
     } 
    } 

添加下面的web.config

<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發生調用

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

如果我Web.Config中從1.8改變MvcMiniProfiler.Data.ProfiledDbProvider版本.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/

這裏有一個如何使用MVC-迷你探查與EF數據庫首先一個例子:

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(); 
} 

編輯:忘了t o add

MiniProfilerEF.Initialize();

這僅用於EF代碼優先。

+0

+1有用的答案 - 只是固定一個小錯誤的'Create'樣品 – BrokenGlass 2012-02-21 22:01:03

+0

在我想你的解決方案,但現在我得到另一個異常像下面 System.NotSupportedException:無法確定用於連接的提供者名稱類型'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 2012-02-22 20:04:43

+0

Hey Yucel,您需要在您的項目中安裝/引用Entity Framework,並且需要MvcMiniProfiler - 您還需要實體框架軟件包。 EntityConnectionStringBuilder將使用EF特定的元數據解析實體框架連接字符串。 ProviderConnectionString是我們習慣使用的名稱(name,connectionString + provider)。在ADO.NET內部,有一個註冊提供程序的工廠,它根據連接字符串中的提供程序屬性實例化正確的提供程序。例如,MSSQL連接通常使用SqlClient提供程序。 – Shelakel 2012-02-27 06:55:13

6

也許這會有所幫助。將MiniProfilerEF.Initialize();移至方法Application_Start()的頂部。請注意,在EF 4.1及更高版本中,所調用的方法應爲MiniProfilerEF.Initialize_EF42();

protected void Application_Start() { 
    Logger.Info("Application start"); 
    MiniProfilerEF.Initialize_EF42(); 
    // ... 
} 
相關問題