2012-02-18 38 views
6

Estoy tratando de integrar MvcMiniProfiler a mi asp.net mvc + entity framewok project. Todo está bien para la primera solicitud web, pero está dando excepción en las otras solicitudes.MvcMiniProfiler No se puede convertir el objeto de tipo EFProfiledDbConnection

Mi proyecto es
MVC 3
Entity Framework 4.1 (DatabaseFirst + POCO Generador DbContext)
MvcMiniProfiler.dll 1.9.0.0
MvcMiniProfiler.EntityFramework.dll 1.9.1.0
instalo MvcMiniProfiler de Nu-Get

Añadido abajo para Global.asax

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

Añadido abajo para 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> 

estoy recibiendo esta excepción

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) 


excepción se produjo en EF llamadas

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

Si cambio de versión de MvcMiniProfiler.Data.ProfiledDbProvider en Web.Config de 1,8 .0.0 a 1.9.0.0 Se produjo un nuevo tipo de excepción en la llamada 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() 

Respuesta

4

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

Aquí hay un ejemplo de cómo utilizar MVC-mini-generador de perfiles con EF primera base de datos:

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

entonces se puede inscribir su entidades con un contenedor COI mediante el método o alternativamente usar algo como

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

Editar: ¿Olvidó su contraseña? o agregar

MiniProfilerEF.Initialize();

Eso solo se utiliza para EF Code First.

+0

+1 respuesta útil - acaba de arreglar un error menor en su 'muestra create' – BrokenGlass

+0

Probé su solución, pero ahora me estoy poniendo otra excepción, como a continuación System.NotSupportedException: No se puede determinar el nombre del proveedor para la conexión del tipo 'MvcMiniProfiler.Data.EFProfiledDbConnection'. System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInvariantName (conexión DbConnection) 613588 System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInfo (DbConnection conexión, DbProviderManifest y providerManifest) 57 System.Data.Entity. DbModelBuilder.Construir (DbConnection providerConnection) 159 – Yucel

+0

Hey Yucel, necesita tener instalado Entity Framework/referencia en su proyecto y adicional a MvcMiniProfiler -usted también necesitan el paquete de Entity Framework. EntityConnectionStringBuilder analizará la cadena de conexión de Entity Framework con metadatos específicos de EF. ProviderConnectionString es a lo que estamos acostumbrados (nombre, proveedor de connectionString +). Internamente en ADO.NET hay una fábrica con proveedores registrados que instancia el proveedor correcto en función del atributo del proveedor en la cadena de conexión. Por ejemplo, las conexiones MSSQL normalmente usan el proveedor SqlClient. – Shelakel

6

Quizás esto ayude. Mueva el MiniProfilerEF.Initialize(); a la parte superior del método Application_Start(). Tenga en cuenta que en EF 4.1 y superior, el método llamado debería ser MiniProfilerEF.Initialize_EF42();.

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