使用mvc-mini-profiler

时间:2011-06-09 11:00:21

标签: asp.net-mvc entity-framework entity-framework-4.1 mvc-mini-profiler

我正在尝试使用带有EFCodeFirst的mvc-mini-profiler我正在创建一个DbProfiledConnection并将其传递给构造中的DbContext,如下所示。应用程序继续按预期工作,sql未向Profiler公开。

public class WebContext : DbContext
{
    static DbConnection _connection = new SqlConnection(ConfigurationManager.ConnectionStrings["WebContext"].ConnectionString);
    static DbConnection _profiledConnection = MvcMiniProfiler.Data.ProfiledDbConnection.Get(_connection);        

    public WebContext()
            : base(_profiledConnection, true)
    {   

    }

我的坏事。

我已对其进行了修改,以便在我的UnitOfWork中构建WebContext时,我传入ProfiledDbConnection

public UnitOfWork()
{             
    var profiledConnection = MvcMiniProfiler.Data.ProfiledDbConnection.Get(connection);
    this.context = new MyContext(profiledConnection);
}

我已经检查过并且在Application_BeginRequest中设置了MiniProfier Current,当我尝试查询数据库时,它会返回ProfiledDbConnection,并在ProfiledDbProviderServices类中抛出错误。

 protected override string GetDbProviderManifestToken(DbConnection connection)
 {
     return tail.GetProviderManifestToken(connection);
 }

此方法返回“提供程序未返回ProviderManifestToken字符串”。错误

1 个答案:

答案 0 :(得分:7)

怀疑这与静态字段初始化程序有关。无论如何,网络应用上的连接从不是静态的(但最多是请求特定的)。

关键是:ProfiledDbConnection实际上是什么? Get方法仅在您当前正在进行性能分析时(在当前请求中)返回ProfiledDbConnection,并且该连接是针对该请求上的MiniProfiler实例进行分析的。

如果使用静态字段,则有两种情况:

  • 静态字段初始化没有请求上下文(或非开发人员请求上下文):MiniProfiler.Current为空时不会进行分析
  • 静态字段已初始化,但所有内容都是根据第一个请求记录的,该请求很快就会死亡