MvcMiniProfiler无法转换EFProfiledDbConnection类型的对象

我正在尝试将MvcMiniProfiler集成到我的asp.net mvc +实体framewok项目中。 第一次Web请求时一切正常,但是在其他请求中给出了exception。

我的项目是
MVC 3
entity framework4.1(DatabaseFirst + POCO Generator DbContext)
MvcMiniProfiler.dll 1.9.0.0
MvcMiniProfiler.EntityFramework.dll 1.9.1.0
我从Nu-Get安装了MvcMiniProfiler

下面添加到global.asax

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

下面添加到web.config

        

我得到了这个例外

  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调用中发生exception

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

如果我将Web.Config中的MvcMiniProfiler.Data.ProfiledDbProvider版本从1.8.0.0更改为1.9.0.0 MiniProfilerEF.Initialize()调用中出现了一种新的exception。

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

也许这会有所帮助。 移动MiniProfilerEF.Initialize();Application_Start()方法的顶部。 请注意,在EF 4.1及更高版本中,调用的方法应为MiniProfilerEF.Initialize_EF42(); 代替。

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

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

以下是如何在EF Database First中使用mvc-mini-profiler的示例:

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

然后,您可以使用该方法向IOC容器注册您的实体,或者使用类似的方法

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

编辑:忘记添加

MiniProfilerEF.Initialize();

这仅用于EF Code First。