您需要 LLBLGen Pro v3。V2 确实为 sqlserver 使用了 dbproviderfactory,但生成的代码仍有一些硬编码转换为 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;
}
编辑。我不确定这是否可行,因为我们的框架使用从 ADO.NET 获得的 DbProviderFactory。该工厂是真正的 Sqlclient 工厂,而不是 ProfiledDbProviderFactory。您可以在此处创建配置文件连接,但这不起作用:工厂不是从连接中获得的,连接是从从 ADO.NET (DbProviderFactories.GetFactory()) 获得的工厂中创建的,并且所有其他元素都是创建的和那个工厂一样。
mvc 探查器必须通过使用包装实际工厂类型的包装器的反射来覆盖 DbProviderFactories 中的数据表。这有点令人讨厌,但使用数据访问代码使事情工作的唯一方法是按照书本做事:获取工厂,通过工厂创建元素。
令我惊讶的是,Linq to sql 和 Entity 框架显然可以与从连接对象获得的工厂一起使用:首先是如何创建该连接对象的?