13

我正在尝试将 mvc-mini-profiler 与 EFCodeFirst 一起使用,我正在创建一个 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 字符串”。错误

4

1 回答 1

7

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

关键是:ProfiledDbConnection实际结果是什么?仅当您当前正在分析(在当前请求上)时,该Get方法才返回 a ,并且针对该请求上的实例分析连接。ProfiledDbConnectionMiniProfiler

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

  • 静态字段在没有请求上下文(或非开发人员请求上下文)的情况下初始化:不会发生分析,因为MiniProfiler.Current它是 null
  • 静态字段已初始化,但所有内容都针对第一个请求进行记录,该请求很快就死了
于 2011-06-09T11:12:09.813 回答