MiniProfiler, код EntityFramework в первую очередь и фоновые задачи nullreference - PullRequest
5 голосов
/ 28 февраля 2012

Сначала я использую код 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();
        ...
    }

Исключение выдается во время первой операции с db в 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-мини-профилировщик \ MvcMiniProfiler \ SqlProfiler.cs: строка 93 в MvcMiniProfiler.MiniProfiler.MvcMiniProfiler.Data.IDbProfiler.ExecuteStart (DbCommand profiledDbCommand, ExecuteType executeType) в C: \ Users \ sam \ Рабочий стол \ mvc-мини-профилировщик \ MvcMiniProfiler \ LineProfID:. в 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)

что я делаю не так? Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: Я попытался инициализировать MiniProfiler (MiniProfilerEF.Initialize();) снова, в потоке, где выполняется задание backgroung (до инициализации DatabaseContext), и теперь есть еще одно исключение:

Невозможно привести объект типа 'MvcMiniProfiler.Data.EFProfiledDbConnection' к типу 'System.Data.SqlClient.SqlConnection

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

1 Ответ

1 голос
/ 06 апреля 2012

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

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

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

string connectionString = connection.StoreConnection.ConnectionString;
...