Использование профилирования базы данных mvc-mini-profiler с Llblgen

Я пытаюсь интегрировать 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 ответа

Решение

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

Вам нужен 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;
}

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

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

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

Другие вопросы по тегам