2011-12-29 20 views
7

No se puede convertir objeto de tipo 'MvcMiniProfiler.Data.EFProfiledDbConnection' al tipo 'System.Data.SqlClient. SqlConnection '.No se puede convertir objeto de tipo 'MvcMiniProfiler.Data.EFProfiledDbConnection' al tipo 'System.Data.SqlClient.SqlConnection'

Estoy tratando de actualizar a MvcMiniProfiler 1.9.0 y sigo obteniendo esto cuando llamo a MiniProfilerEF.Initialize(). He eliminado la sección de configuración de system.data. No sé lo que estoy haciendo mal. He seguido los pasos en el sitio, pero tal vez me perdí algo?

Estoy utilizando el código EF primero 4.1 y estoy pasando el nombre de mi conexión en un constructor para crear mi datacontext.

Activador Web

using Project.Web.App_Start; 
using WebActivator; 

[assembly: PreApplicationStartMethod(typeof(MiniProfiler), "Start")] 

namespace Project.Web.App_Start { 
    public class MiniProfiler { 
     public static void Start() 
     { 
      if (Eco.Environment.IsDevelopment) { 
       MiniProfilerEF.Initialize(); 
      } 
     } 
    } 
} 

Registro StructureMap:

using Project.Domain.Repositories; 
using StructureMap.Configuration.DSL; 

namespace Project.Web.DependencyResolution.Registries { 
public class RepositoriesRegistry : Registry { 
    public RepositoriesRegistry() { 
     For<IProjectDataContext>().HybridHttpOrThreadLocalScoped().Use(() => new ProjectDataContext(Eco.Database.Name)); 
      } 
    } 
} 

DataContext Constructor:

public ProjectDataContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) { 
     Active = new Active(this); 
    } 

He quitado dataproviders System.Data Fron mi config ya que la documentación dice que sólo necesito para llamar a MiniProfilerEF.Initialize().

** Actualización

Anteriormente en 1.7 MvcMiniProfiler que tenía que establecer la propiedad Database.DefaultConnectionFactory, pero he eliminado eso. La Database.DefaultConnectionFactory siempre vuelve como SqlConnectionFactory, ¿no debería ser ProfiledConnectionFactory o algo así?

+0

¿Puede proporcionar un archivo de código + configuración? Normalmente, define la cadena de conexión en el archivo de configuración del mismo nombre que su clase DBContext, y nunca necesita usar un constructor no predeterminado. – Tejs

+0

Iirc hay una configuración de muestra EF en nuget. Pero, ¿puedo preguntar: siempre le das una conexión perfilada? ¿O a veces (quizás dependiendo del usuario) utiliza una conexión de perfiles, y a veces usa una conexión de SQL desnudo? –

+0

@MarcGravell Hice esto con la versión 1.7. Cambiaría de una conexión perfilada (Debug) a una conexión sql en (Release). Funcionó bien –

Respuesta

0

El problema que veo aquí es que ProjectDataContext encapsula algunos contextos de datos en la propiedad "Activo", que no pudo ser encontrada por el proxy MvcProfiler.

Más que eso, EFProfiledDbConnection es en realidad hijo DbConnection, pero no hijo de SqlConnection. Está hecho en términos de abstracción para usar diferentes proveedores de Db, como MySql, Postgres, etc. Intente revisar todas las variables en el código, deben ser DbConnection, pero no SqlConnection (este es un proveedor de MsSql).

2

Estaba viendo el mismo error. Me volvía loco, pero finalmente lo descubrí. Mi problema no tiene nada que ver con web.config, ensamblados, Initialize_42 o Initialize(false) hacks ni nada.

Aquí es donde me salió mal ...

me había permitido la aplicación automática de las migraciones como esto:

App_Start:

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<DataContext, Migrations.Configuration>() 
); 

Migraciones/Configuration.cs:

internal sealed class Configuration 
    : DbMigrationsConfiguration<Path.To.DataContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 
} 

Y eso se estaba activando a través de WebActivator de esta manera:

[assembly: WebActivator.PreApplicationStartMethod(
    typeof(service_tracker_mvc.App_Start.DatabaseInitializer), "Start")] 

Descubrí accidentalmente que deshabilitar este proceso daba como resultado el funcionamiento del generador de perfiles. El problema, como ocurre, es que este proceso de inicio estaba sucediendo demasiado pronto.Ocurre normalmente durante Application_Start (si no estás usando este sofisticado elemento de WebActivator) así que lo cambié a PostStart. Ahora funciona:

     ▼▼▼▼ 
[assembly: WebActivator.PostApplicationStartMethod(
    typeof(service_tracker_mvc.App_Start.DatabaseInitializer), "Start")] 
0

tenía este mismo problema y la manera que encontré para solucionarlo era mover a Glimpse: http://getglimpse.com/. En mi opinión, es mucho mejor que miniprofiler, fácil de usar, completo, etc.

1

ver https://stackoverflow.com/a/10814033/311289

esto es consecuencia de hacer las operaciones de base de datos antes de iniciar miniprofiler, poner un punto de interrupción en el contstructor para su db contexto, y otro en la línea MiniProfilerEF.Initialize();, y revisar hasta que la inicialización sea primero.

2

Cometí el error de agregar MiniProfiler.EF en lugar de MiniProfiler.EF6. La eliminación de MiniProfiler.EF y su sustitución por la versión EF6 solucionó mi problema.

+0

Gracias Sam, esto me salvó. – Bassie

Cuestiones relacionadas