【发布时间】: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