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