【问题标题】:Upgrading to MvcMiniProfiler 1.9 from 1.7 .NET MVC3 and EF Code First从 1.7 .NET MVC3 和 EF Code First 升级到 MvcMiniProfiler 1.9
【发布时间】:2011-10-05 19:36:35
【问题描述】:

今天我又回到了一个我过去一个月左右没有参与的项目。我使用 MiniProfiler 1.7 配置了这个项目,一切都很好。它还分析了我的数据库调用和视图性能。

我决定升级到 1.9,但遇到了一些减速带。现在,我已经解决了此时的大部分问题。唯一看起来“错误”的是数据库分析。由于以下错误,我将出现黄屏死机:

A null was returned after calling the 'get_ProviderFactory' method on a store 
provider instance of type 'MvcMiniProfiler.Data.ProfiledDbConnection'. 
The store provider might not be functioning correctly.

作为参考,让我向您展示我如何在 1.7 中使用 MVC3 和 EF 4.1 Code First 设置 miniprofiler。

web.config

  <system.data>
<DbProviderFactories>
  <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" />
  <add name="MvcMiniProfiler.Data.ProfiledDbProvider" 
       invariant="MvcMiniProfiler.Data.ProfiledDbProvider" 
       description="MvcMiniProfiler.Data.ProfiledDbProvider" 
       type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler, Version=1.7.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />
</DbProviderFactories>

Global.asax 从那里处理了大部分事情。我将列出之前有效但现在无效的相关 Application_Start() 代码。

#region MVC Mini Profiler related database profiling config/setup

        //This line makes SQL Formatting smarter so you can copy/paste 
        // from the profiler directly into Query Analyzer
        MiniProfiler.Settings.SqlFormatter = new SqlServerFormatter();

        var factory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
        var profiled = new ProfiledDbConnectionFactory(factory);
        Database.DefaultConnectionFactory = profiled;

#endregion

最后一步是在我的上下文中挂钩已分析的连接:

public class Database : DbContext
{
    public Database()
        : base(GetProfilerConnection(), true)
    {}

    private static DbConnection GetProfilerConnection()
    {
        return
            ProfiledDbConnection.Get(
                new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString));
    }
}

快进到今天,我重新设计了一些东西以使用 MVC3 minprofiler nuget 包和 EF miniprofiler NuGet 包,但我不知道如何让数据库分析再次工作。

我已将 web.config 修改为以下内容,似乎符合要求,但 ReSharper 一开始并不满意。

  <system.data>
<DbProviderFactories>
  <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" />
  <add name="MvcMiniProfiler.Data.ProfiledDbProvider" invariant="MvcMiniProfiler.Data.ProfiledDbProvider"
       description="MvcMiniProfiler.Data.ProfiledDbProvider"
       type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler.EntityFramework, Version=1.9.1.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />
</DbProviderFactories>

不太清楚我在这里缺少什么。通过调用 MiniProfilerEF.Initialize(); 我什至还需要这个吗?一些文档和建议似乎表明您甚至不再需要它了。

更大的问题是如何在 1.9 中设置 DB Profiling。

我之前在 Global.asax 中的相关代码现在已移至 App_Start 文件夹中的 MiniProfiler.cs 中。我认为设置将是相同的,但似乎并非如此。

我想做这个(也许是因为这正是我在 1.7 中所熟悉的)

//TODO: To profile a standard DbConnection: 
        var factory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
        var profiled = new ProfiledDbConnectionFactory(factory);
        Database.DefaultConnectionFactory = profiled;

这似乎不再起作用了。我还注意到,似乎我现在应该使用 EFProfiledDbConnection 而不仅仅是 ProfiledDbConnection?这是正确的吗?

如何使用此模型配置数据库分析?我正在通过文档从高处和低处挖掘,但是旧方式与新方式混合在一起的信息太多了,我很难区分今天的“正确”方式是什么。

【问题讨论】:

  • 尝试用MiniProfilerEF.Initialize_EF42()替换你的Initialize电话。
  • Initialize_EF42 将在 2.0 版中被推送到 nuget .... 它在 1.9.1 中不存在

标签: c# asp.net-mvc entity-framework ef-code-first mvc-mini-profiler


【解决方案1】:

呃,对不起各位。

我解决了这个问题。

我必须在我的数据模型项目中添加 EF MVCMiniProfiler NuGet 包并将那里的连接类型更改为 EFProfiledConnection,如下所示:

        /// <summary>
    /// Supply our own connection string to the DBContext to utilize mini-profiler for SQL queries as well.
    /// </summary>
    /// <returns>DBConnection</returns>
    private static DbConnection GetProfilerConnection()
    {
        return new EFProfiledDbConnection(new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString),
                                        MiniProfiler.Current);
    }

看看 EF 是如何分解成它自己的连接类型的,这对我来说应该是显而易见的。

我还注释掉了配置设置,以便确认它们不再需要。

我不知道这是否是配置 EF 和 MVC Mini 1.9 的“正确”方式,但它确实有效。

我愿意接受有关改进的建议,或者是否有更正确的方法来做到这一点,但现在我已经恢复正常运行了。

【讨论】:

  • 对不起,我试过了,但没用。不断收到错误消息,指出 EF 无法确定 EFProfiledDbConnection 的提供程序类型。
  • 你能告诉我你在哪里添加这个方法吗?到上下文? @SamSaffron 请帮忙!还是模特!它正在炸毁我的存储库工厂!!!
  • 注意。我的 EntityFramework 对象上下文位于单独的程序集中,因此那里没有连接字符串配置。
  • 这个方法被添加到上下文中。我的上下文构造函数定义为 public ContextName() : base(GetProfilerConnection(), true)
  • @KhalidAbuhakmeh 我遇到了同样的问题。你有想过吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多