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

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

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

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


person Adas Petrovas    schedule 15.06.2011    source источник


Ответы (2)


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

person David Elizondo    schedule 30.07.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;
}

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

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

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

person Frans Bouma    schedule 16.06.2011
comment
Я использую LLBLGen Pro v3.1.11.0207. Я пытался перезаписать таблицу DbProviderFactories, но оказалось, что ProfiledDbProviderFactory, предоставленный MvcMiniProfiler, для этой цели не подходит - это внутренний тип и у него нет конструктора без параметров. Исключение, которое я получил: [InvalidOperationException: запрошенная реализация поставщика данных .Net Framework не имеет поля Instance производного типа System.Data.Common.DbProviderFactory.]. Итак, похоже, что требуется много усилий, и я какое-то время пропускаю эту задачу. - person Adas Petrovas; 17.06.2011
comment
Хммм... это действительно шоу-стопор. Мы заняты нашим собственным профилировщиком, но он не выйдет некоторое время (позже в этом году). Вы можете попробовать LLBLGenProf на данный момент, он не так привязан к MVC, как профилировщик, но он профилирует ваше приложение llblgen pro :) О, и обновите свою установку llblgen pro последней сборкой из клиентской области, вы используете первый выпуск v3.1, который устарел, с тех пор у нас было несколько исправлений. - person Frans Bouma; 19.06.2011