20 votos

¿Cómo puedo correctamente el perfil de Entity Framework?

¿Cuál es la mínima cantidad de código que puedo escribir para recibir una devolución de llamada de EF 4.1, que proporciona las siguientes:

  • OnSQLExecuted(DbCommand cmd, DateTime start, double durationMS, string stacktrace)

En el momento en que el uso de una desagradable mirada de lo que parece ser una fuga de rendimiento, tengo curiosidad en cómo podemos lograr esta devolución de llamada con un mínimo de impacto en la aplicación.


Somos capaces de cable esta en Mini Analizador por cortar a su alrededor - al principio cambiamos Database.DefaultConnectionFactory sin embargo la retirada del estiércol, con el valor predeterminado de fábrica significa que usted no puede tener dos perfiles de fábricas en marcha al mismo tiempo. Así que nos fuimos a los más agresivos de la ruta.


La técnica comúnmente utilizada es bastante simple de implementar: DbProviderFactory, IDbConnectionFactory, DbProviderServices, DbConnection, DbCommand y DbDataReader de tal manera que ellos interceptar las llamadas y de perfil.

Hasta ahora, fácil... sin embargo se consigue sucio cuando se trate de alambre:

   try
    {
        // ensure all the factories are loaded 
        DbProviderFactories.GetFactory("...");
    }
    catch (ArgumentException)
    {
    }

    Type type = typeof(DbProviderFactories);

    DataTable table;
    // SUPER UGLY - Can this be done in another way? 
    object setOrTable = (type.GetField("_configTable", BindingFlags.NonPublic | BindingFlags.Static) ??
                    type.GetField("_providerTable", BindingFlags.NonPublic | BindingFlags.Static)).GetValue(null);
    if (setOrTable is DataSet)
    {
        table = ((DataSet)setOrTable).Tables["DbProviderFactories"];
    }

    table = (DataTable)setOrTable;

    foreach (DataRow row in table.Rows.Cast<DataRow>().ToList())
    {
        DbProviderFactory factory;
        try
        {
            factory = DbProviderFactories.GetFactory(row);
        }
        catch (Exception)
        {
            continue;
        }

        var profType = typeof(MvcMiniProfiler.Data.EFProfiledDbProviderFactory<>).MakeGenericType(factory.GetType());


        DataRow profiled = table.NewRow();
        profiled["Name"] = row["Name"];
        profiled["Description"] = row["Description"];
        profiled["InvariantName"] = row["InvariantName"];
        profiled["AssemblyQualifiedName"] = profType.AssemblyQualifiedName;
        table.Rows.Remove(row);
        table.Rows.Add(profiled);

    }

Se requiere algo de reflexión hacks y totalmente bombas sobre la última versión de EF:

FileLoadException: The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)

Esto fue documentado por tanto Frans y Ayende.

¿Cómo puedo conectar mis perfiles de las fábricas y de la familia en un robusto y elegante?
¿Hay alguna otra manera de conseguir mi devolución de llamada?

9voto

Stephen Cleary Puntos 91731

La forma más sencilla es utilizar el Marco de la Entidad de seguimiento de contenedores y el gancho en la EFTracingConnection's CommandFinished. No te da el tiempo de inicio, pero darle a la duración (que, restado de Now, es probablemente lo suficientemente cerca).

Yo llamaría el código de impacto "moderado", ya que tienes que cambiar las referencias al contexto de la clase. Es bastante sencillo, sin embargo.

Si usted sólo quiere el seguimiento y no necesita la real de devolución de llamada, el paquete de NuGet tiene un simple defecto del sistema de rastreo.

Editar (seguimiento de la pila de agregado): El EF de seguimiento de contenedores no te dan el seguimiento de la pila. Usted puede obtener el código fuente y agregar sin demasiada dificultad, pero me gustaría pensar que tendría un impacto en el rendimiento.

7voto

Chris Marisic Puntos 11495

Aunque es un producto comercial también me gustaría recomendar encarecidamente mirando EF Prof. Esta herramienta ha sido desarrollada por Ayende (Oren Eini ortografía?) que también ha realizado NH Profe, Uber Prof (NH + EF Profe) y RavenDB entre otros productos.

Después de haber comprado su NH Profe, cuando la sintonización NH fue invaluable y yo esperaría EF Profe iba a ser tan valioso, respectivamente.

0voto

Ladislav Mrnka Puntos 218632

Primero: Si usted está buscando para la implementación personalizada donde usted puede activar su propio evento directamente en EF olvidarse de él. ADO.NET el equipo de alguna manera se olvidó de implementar cualquiera de los puntos de extensión y que incluso se olvidó de aplicar cualquier registro (excepto la conversión de ObjectQuery / DbQuery a SQL pero no puede gestionar la carga diferida o modificaciones de datos).

Yo creo que todos los de seguimiento de la implementación se utiliza con EF se realiza mediante la creación personalizada DbProviderFactory que se adapta a la real fábrica y envolturas real Connection, Command, etc. Que es muy claramente descrito en el rastreo de contenedores.

Hay a herramientas comerciales que ya hacen lo que quieren

  • Mencionó EF Profe es una gran herramienta, pero es un costo de $300 por asiento.
  • Alternativa de Herramientas de Consulta Analizador. Especialmente esta captura de pantalla que se parece a lo que usted está buscando. El precio es mucho más bajo ($40 por asiento) y es compatible con Linq to sql, Entity Framework y LLBLGen.

Ambas herramientas tienen prueba gratuita para que pueda descargarlos y probarlos.

Btw. tal vez usted puede obtener una gran cantidad de información que usted está buscando para Intelli de Seguimiento si usted tiene VS 2010 Ultimate. Usted puede leer acerca de todas las alternativas disponibles en MSDN Magazine.

Creo que hay un gran signo de interrogación - ¿es usted el uso de DbContext o ObjectContext (usted mencionó EFv4.1)? Dichas herramientas y rastreo de contenedores fueron creados para ObjectContext API así que no estoy seguro de cómo trabajar con la API de DbContext. Usted todavía puede obtener ObjectContext de DbContext , pero si la herramienta de esperar EntityConnection lugar de conexión común será un problema.

0voto

marvelTracker Puntos 984

Puedo recomendar el Marco de la Entidad del Analizador y la suscripción Mensual es adecuado para usted necesita con un costo mínimo de $16 US al mes. Hemos tenido algunos problemas de rendimiento con DbContext y proporciona buena información visual para corregir esos. usted puede integrar EF analizador con el servidor de integración continua y mantener a mejorar su rendimiento.

http://efprof.com/

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X