我正在尝试将mvc-mini-profiler与用于数据访问的Llblgen集成到asp.net mvc应用程序中。我试图覆盖llblgen的CommonDaoBase.CreateConnection:
public override DbConnection CreateConnection(string connectionString)
{
return MvcMiniProfiler.Data.ProfiledDbConnection.Get(base.CreateConnection(connectionString));
}
但是这导致异常,说'无法转换为SqlConnection ......'。有人让mvc-mini-profiler与llblgen一起工作吗?
答案 0 :(得分:1)
Miha Markic刚刚在他的博客中发布了答案:http://blog.rthand.com/post/2011/07/24/Integrating-MvcMiniProfiler-and-LLBLGenPro.aspx
答案 1 :(得分:0)
您需要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 profiler必须通过包装实际工厂类型的包装器反射来覆盖DbProviderFactories中的数据表。这有点令人讨厌,但是使用数据访问代码实现工作的唯一方法是通过本书来完成工作:获取工厂,通过工厂创建元素。
令我惊讶的是Linq to sql和Entity框架显然与从连接对象获得的工厂一起工作:首先如何创建该连接对象?