13

Estoy tratando de usar el mvc-mini-profiler con EFCodeFirst Estoy creando una conexión DbProfiledConnection y pasándola al DbContext en la construcción de la siguiente manera. La aplicación continúa funcionando según lo esperado por sql y no está expuesta al Analizador.Usando mvc-mini-profiler

public class WebContext : DbContext 
{ 
    static DbConnection _connection = new SqlConnection(ConfigurationManager.ConnectionStrings["WebContext"].ConnectionString); 
    static DbConnection _profiledConnection = MvcMiniProfiler.Data.ProfiledDbConnection.Get(_connection);   

    public WebContext() 
      : base(_profiledConnection, true) 
    { 

    } 

oops my bad.

He modificado de tal manera que cuando mi WebContext se construye en mi UnitOfWork me pase en un ProfiledDbConnection

public UnitOfWork() 
{    
    var profiledConnection = MvcMiniProfiler.Data.ProfiledDbConnection.Get(connection); 
    this.context = new MyContext(profiledConnection); 
} 

He comprobado y MiniProfier actual se ha establecido en Application_BeginRequest y devuelve un ProfiledDbConnection cuando luego intenta consultar la base de datos y se genera un error en la clase ProfiledDbProviderServices.

protected override string GetDbProviderManifestToken(DbConnection connection) 
{ 
    return tail.GetProviderManifestToken(connection); 
} 

este método devuelve un "El proveedor no devolvió una cadena ProviderManifestToken". error

+6

por cierto, un c estática la conexión es peligrosa, debe ser específica de la solicitud. –

+0

¿Por qué es peligrosa una conexión estática? Además, ¿estoy realmente usando un contexto estático si comienzo un nuevo contexto solo en la parte superior de mi controlador y no en cada solicitud? – sirtimbly

Respuesta

7

I sospechoso esto se relaciona con el inicializador de campo estático. Las conexiones en las aplicaciones web deben nunca ser estáticas de todos modos (pero a petición como máximo).

La clave es: ¿cómo sale realmente ProfiledDbConnection? El método Get devuelve ProfiledDbConnection solo si está creando perfiles actualmente (en la solicitud actual) y la conexión se perfila en la instancia MiniProfiler en esa solicitud.

Si se utiliza un campo estático, entonces hay dos escenarios:

  • campo estático se inicializa sin un contexto de la petición (o un contexto de la petición no desarrollador): sin perfiles ocurrirá como MiniProfiler.Current es nulo
  • campo estático se inicializa, pero todo se registra en contra de la primera solicitud, la cual es rápidamente muertos
+0

Un gran +1. No tiene mucho sentido crear perfiles de una aplicación con una referencia de contexto estático. ¡Puede decir simplemente al ver que tendrá problemas! –

+0

oops mi mal. Cambié mi código pero ahora obtengo una excepción de token en ProfiledDbProviderServices –

+1

@feanz ah right; ok, EF codefirst no es una herramienta que uso, entonces no he validado ese escenario. Sin embargo, hemos tenido (hoy) un usuario que ofrece voluntariamente un parche para el código EF primero. Dame unas horas para fusionar, etc. –

Cuestiones relacionadas