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