MiniProfiler,EntityFramework代码优先和后台任务nullreference

时间:2012-02-27 20:11:49

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

我首先在我的mvc3项目中使用EF 4.2代码。

miniprofiler工作正常(sql + mvc),但我遇到了异步任务的问题。

我以这种方式表演'(这个方法好吗?我对此new DatabaseContext() 感到有些不安)

public static void PerformAsycAction(this User user, Action<User> action)
{
   ThreadPool.QueueUserWorkItem(_ =>
   {
     var context = new DatabaseContext();
     MiniProfilerEF.Initialize();
     var consistantUser = context.Set<User>().Get(user.Id);
     action(consistantUser);
     context.SaveChanges();
   });
}

我在Application_Start中有适当的行:

  protected void Application_Start()
    {
        MiniProfilerEF.Initialize();
        ...
    }

action(consistantUser);中使用db进行第一次操作时抛出了这种情况 这是跟踪:

  

在C:\ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ MiniProfiler.cs中的MvcMiniProfiler.MiniProfiler.AddSqlTiming(SqlTiming stats):第274行       在MvcMiniProfiler.SqlTiming..ctor(DbCommand命令,ExecuteType类型,MiniProfiler探查器)中的C:\ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ SqlTiming.cs:第137行       在C:\ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ SqlProfiler.cs中的MvcMiniProfiler.SqlProfiler.ExecuteStartImpl(DbCommand命令,ExecuteType类型):第39行       在MvcMiniProfiler.SqlProfilerExtensions.ExecuteStart(SqlProfiler sqlProfiler,DbCommand命令,ExecuteType类型)在C:\ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ SqlProfiler.cs:第93行       在MvcMiniProfiler.MiniProfiler.MvcMiniProfiler.Data.IDbProfiler.ExecuteStart(DbCommand profiledDbCommand,ExecuteType executeType)在C:\ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ MiniProfiler.IDbProfiler.cs:第14行       在C:\ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ Data \ ProfiledDbCommand.cs中的MvcMiniProfiler.Data.ProfiledDbCommand.ExecuteDbDataReader(CommandBehavior behavior):第158行       在System.Data.Common.DbCommand.ExecuteReader(CommandBehavior行为)       在System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)

我做错了什么? 任何帮助将不胜感激。

编辑:我尝试在执行backgroung任务的线程中(在启动DatabaseContext之前)再次初始化MiniProfiler(MiniProfilerEF.Initialize();),现在还有另一个例外:

  

无法将“MvcMiniProfiler.Data.EFProfiledDbConnection”类型的对象强制转换为“System.Data.SqlClient.SqlConnection”

实际上,在后台线程中对查询进行概要分析并不是必需的,但崩溃整个线程,因此应用程序无法正常工作,我不得不讨论整个探查器。有没有办法为它,后台,线程禁用它以防止它崩溃?

1 个答案:

答案 0 :(得分:1)

代码在尝试访问连接字符串时中断,因为连接字符串是实体框架样式的连接字符串。

将连接字符串传递给迷你剖析器时,必须从EF连接字符串中提取实际的连接字符串。

EntityConnection connection = 
    new EntityConnection(ConfigurationManager
                   .ConnectionStrings["ConnectionStringName"].ConnectionString));

string connectionString = connection.StoreConnection.ConnectionString;