Asp.net mvc 3 当使用代码优先和存储库模式时,MvcMiniProfiler不会显示数据库评测
我正在尝试使用ASP.NET MVC3应用程序设置数据库评测。我关注了我能找到的关于这一点的每个博客,结果是: 在web.config中:Asp.net mvc 3 当使用代码优先和存储库模式时,MvcMiniProfiler不会显示数据库评测,asp.net-mvc-3,ef-code-first,mvc-mini-profiler,Asp.net Mvc 3,Ef Code First,Mvc Mini Profiler,我正在尝试使用ASP.NET MVC3应用程序设置数据库评测。我关注了我能找到的关于这一点的每个博客,结果是: 在web.config中: <system.data> <DbProviderFactories> <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" /> <add name="MvcMiniProfiler.Data.ProfiledDbProvider
<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.6.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />
</DbProviderFactories>
</system.data>
在控制器中:
public ActionResult About()
{
var profiler = MiniProfiler.Current;
using (profiler.Step("call database"))
{
ProjectResult result = projectService.Create("slug");
return View();
}
}
我正在使用存储库模式,我的EF代码首先存在于MVC应用程序引用的另一个项目中
我的数据库类看起来像:
public class Database : DbContext
{
public Database(string connection) : base(connection)
{
}
public DbSet<Project> Projects { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Project>().Property(p => p.Slug).IsUnicode().IsRequired().IsVariableLength().HasMaxLength(64);
}
public virtual void Commit()
{
base.SaveChanges();
}
}
public class DatabaseFactory : Disposable, IDatabaseFactory
{
private readonly string connectionString;
private Database database;
public DatabaseFactory(string connectionString)
{
Check.Argument.IsNotNullOrEmpty(connectionString, "connectionString");
this.connectionString = connectionString;
}
public Database Get()
{
return database ?? (database = new Database(connectionString));
}
protected override void DisposeCore()
{
if (database != null)
database.Dispose();
}
}
当我运行应用程序时,探查器根本不会显示任何数据库评测,只显示控制器/视图的常规执行时间
感谢您的帮助
感谢EF/Code的注意事项首先,声明您的工厂和其他代码必须在任何EF内容之前运行,这使我怀疑在应用程序启动时安装此代码太迟了。尝试创建预启动类,如下所示:
[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.App_Start.AppStart_MiniProfiler), "Start")]
namespace MyApp.App_Start
{
[INSERT using DECLARATIONS]
public static class AppStart_MiniProfiler
{
public static void Start()
{
Bootstrapper.Run();
MiniProfiler.Settings.SqlFormatter = new SqlServerFormatter();
var factory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["TemplateDB"].ConnectionString);
var profiled = new MvcMiniProfiler.Data.ProfiledDbConnectionFactory(factory);
Database.DefaultConnectionFactory = profiled;
}
}
}
在您的项目中创建一个App_Start文件夹,并将该类放在App_Start文件夹中。EF/Code的注释首先说明,在任何EF内容之前,必须运行工厂和其他代码,这使我怀疑在Application_Start中安装此代码为时已晚。尝试创建预启动类,如下所示:
[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.App_Start.AppStart_MiniProfiler), "Start")]
namespace MyApp.App_Start
{
[INSERT using DECLARATIONS]
public static class AppStart_MiniProfiler
{
public static void Start()
{
Bootstrapper.Run();
MiniProfiler.Settings.SqlFormatter = new SqlServerFormatter();
var factory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["TemplateDB"].ConnectionString);
var profiled = new MvcMiniProfiler.Data.ProfiledDbConnectionFactory(factory);
Database.DefaultConnectionFactory = profiled;
}
}
}
在项目中创建一个App_Start文件夹,并将该类放置在App_Start文件夹中。通过安装Nuget MiniProfiler和MiniProfiler.EF包解决。在Global.asax中添加以下内容
protected void Application_Start()
{
MiniProfilerEF.Initialize();
}
protected void Application_BeginRequest()
{
if (Request.IsLocal)
{
MiniProfiler.Start();
}
}
protected void Application_EndRequest()
{
MiniProfiler.Stop();
}
最后,将下面的代码添加到标记的JQuery下面的标题中
@MvcMiniProfiler.MiniProfiler.RenderIncludes()
你准备好了。工作起来很有魅力。通过安装Nuget MiniProfiler和MiniProfiler.EF包解决了这个问题。在Global.asax中添加以下内容
protected void Application_Start()
{
MiniProfilerEF.Initialize();
}
protected void Application_BeginRequest()
{
if (Request.IsLocal)
{
MiniProfiler.Start();
}
}
protected void Application_EndRequest()
{
MiniProfiler.Stop();
}
最后,将下面的代码添加到标记的JQuery下面的标题中
@MvcMiniProfiler.MiniProfiler.RenderIncludes()
你准备好了。工作起来很有魅力。@Thomas,行
Bootstrapper.Run()
的作用是什么?它是否需要在MiniProfiler代码之前?它只是设置路由、过滤器和一些其他启动任务。实际上,我从您的代码中取出了它,并将其保存在应用程序启动中。这样,AppStart\u MiniProfiler.Start()会比其他任何东西都先运行。@Thomas,Bootstrapper.Run()
行的作用是什么?它是否需要在MiniProfiler代码之前?它只是设置路由、过滤器和一些其他启动任务。实际上,我从您的代码中取出了它,并将其保存在应用程序启动中。这样一来,AppStart\u MiniProfiler.Start()会比其他任何东西都先运行。我也遇到了同样的问题。[链接]1.7版本根据@consullerBen给出的答案进行设置。和thomas一样,我仍然无法让SQL评测工作,我也遇到了同样的问题。[链接]1.7版本根据@consullerBen给出的答案进行设置。和thomas一样,我仍然无法让SQL评测工作。