Использование профилирования базы данных mvc-mini-profiler с Llblgen - PullRequest
1 голос
/ 15 июня 2011

Я пытаюсь интегрировать mvc-mini-profiler в приложение asp.net mvc с Llblgen, используемым для доступа к данным. Я попытался переопределить LIBLGEN CommonDaoBase.CreateConnection:

public override DbConnection CreateConnection(string connectionString)
{
  return MvcMiniProfiler.Data.ProfiledDbConnection.Get(base.CreateConnection(connectionString));
}

но это привело к исключению, говоря: «Невозможно привести к SqlConnection ...». У кого-нибудь есть mvc-mini-profiler, работающий с llblgen?

Ответы [ 2 ]

1 голос
/ 30 июля 2011

Миха Маркич только что опубликовал ответ в своем блоге: http://blog.rthand.com/post/2011/07/24/Integrating-MvcMiniProfiler-and-LLBLGenPro.aspx

0 голосов
/ 16 июня 2011

Вам нужен LLBLGen Pro v3. V2 действительно использует dbproviderfactory для sqlserver, но в сгенерированном коде есть еще несколько жестко преобразованных классов SqlClient. v3 нет. Я полагаю, вы используете v2?

Кроме того, необходимо внести небольшое изменение в файл ProfiledDbProviderFactory.cs профилировщика:

/// <summary>
/// Extension mechanism for additional services;  
/// </summary>
/// <returns>requested service provider or null.</returns>
object IServiceProvider.GetService(Type serviceType)
{
    if(serviceType == typeof(ProfiledDbProviderFactory))
    {
        // For LLBLGen Pro v3 and up.
        return tail;
    }
    IServiceProvider tailProvider = tail as IServiceProvider;
    if (tailProvider == null) return null;
    var svc = tailProvider.GetService(serviceType);
    if (svc == null) return null;

#if ENTITY_FRAMEWORK
    if (serviceType == typeof(DbProviderServices))
    {
        svc = new ProfiledDbProviderServices((DbProviderServices)svc, profiler);
    }
#endif
    return svc;
}

EDIT . Я не уверен, будет ли это работать, так как наша структура использует DbProviderFactory, полученный из ADO.NET. Эта фабрика - настоящая фабрика Sqlclient, а не ProfiledDbProviderFactory. Вы можете создать профилированное соединение здесь, но это не сработает: фабрика не получается из соединения, соединение создается из фабрики, полученной из ADO.NET (DbProviderFactories.GetFactory ()), и все остальные элементы создаются с этим заводом.

Профилировщик MVC должен перезаписать данные в DbProviderFactories путем отражения с помощью упаковщиков, которые обертывают фактические фабричные типы. Это довольно неприятно, но единственный способ заставить вещи работать с кодом доступа к данным, который работает по книге: получить фабрику, создать элементы через фабрику.

меня удивляет Linq to sql, и Entity Framework, очевидно, работает с фабрикой, полученной из объекта подключения: как вообще можно было создать этот объект подключения?

...