使用Llblgen进行mvc-mini-profiler数据库分析

时间:2011-06-15 14:44:09

标签: llblgenpro mvc-mini-profiler

我正在尝试将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一起工作吗?

2 个答案:

答案 0 :(得分:1)

答案 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框架显然与从连接对象获得的工厂一起工作:首先如何创建该连接对象?