MiniProfiler, первый код EntityFramework и фоновые задачи nullreference

Сначала я использую код EF 4.2 в своем проекте mvc3.

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); вот трассировка:

в MvcMiniProfiler.MiniProfiler.AddSqlTiming (статистика SqlTiming) в C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\MiniProfiler.cs:строка 274 в MvcMiniProfiler.SqlTiming..ctor(команда DbCommand, тип ExecuteType, профилировщик MiniProfiler ) в C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\SqlTiming.cs:строка 137 в MvcMiniProfiler.SqlProfiler.ExecuteStartImpl(команда DbCommand, тип ExecuteType) в C:\Users\sam\Desktop\mvc- mini-profiler\MvcMiniProfiler\SqlProfiler.cs:строка 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 в MvcMiniProfiler. Data.ProfiledDbCommand.ExecuteDbDataReader (поведение CommandBehavior) в C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\Data\ProfiledDbCommand.cs:строка 158 в System.Data.Common.DbCommand.ExecuteReader(поведение CommandBehavior) в System.Data.EntityClient .EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, поведение CommandBehavior)

Что я делаю неправильно? Любая помощь будет оценена.

EDIT: я попытался снова инициализировать MiniProfiler (MiniProfilerEF.Initialize();) в потоке, в котором выполняется фоновая задача (до запуска DatabaseContext), и теперь есть другое исключение:

Невозможно преобразовать объект типа «MvcMiniProfiler.Data.EFProfiledDbConnection» в тип «System.Data.SqlClient.SqlConnection».

На самом деле нет необходимости профилировать запросы в фоновом потоке, но это крашит весь поток, поэтому приложение работает неправильно, и мне приходится отключать весь профилировщик. Есть ли способ отключить его для этого, фона, потока, чтобы предотвратить его сбой?


person roman-roman    schedule 27.02.2012    source источник
comment
Что является фактическим исключением?   -  person Bryan Crosby    schedule 28.02.2012
comment
Вы подтвердили, что не передаете null ни одной из этих функций?   -  person Bryan Crosby    schedule 28.02.2012
comment
Конечно. Точно такой же код работает без профилировщика (без вызова в ApplicationStart).   -  person roman-roman    schedule 28.02.2012
comment
@BryanCrosby, что вы подразумеваете под «этими функциями»? Я использую MiniProfiler от команды SO и ничего не передаю функциям в пространстве имен MvcMiniProfiler, поскольку я не вызываю их явно.   -  person roman-roman    schedule 28.02.2012
comment
Просто примечание о вашем DatabaseContext: вам лучше обернуть его в using.   -  person lorond    schedule 15.04.2012


Ответы (1)


Код прерывается, когда он пытается получить доступ к вашей строке подключения, поскольку строка подключения является строкой подключения в стиле Entity Framework.

При передаче строки подключения мини-профилировщику необходимо извлечь фактическую строку подключения из строки подключения EF.

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

string connectionString = connection.StoreConnection.ConnectionString;
person bleepzter    schedule 06.04.2012