Использование профилирования базы данных 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, очевидно, работает с фабрикой, полученной из объекта соединения: как вообще можно было создать этот объект соединения?