2012-02-27 4 views
5

Сначала я использую код EF 4.2 в моем проекте mvc3.MiniProfiler, EntityFramework code first и background tasks nullreference

miniprofiler отлично работает (sql + mvc), но у меня проблема с асинхронными задачами.

я выполняю «Em этот путь (этот метод хорошо, я чувствую себя немного неловко с этим 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 мини-профилировщика \ 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, Exe cuteType executeType) в C: \ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ MiniProfiler.IDbProfiler.cs: строка 14 в MvcMiniProfiler.Data.ProfiledDbCommand.ExecuteDbDataReader (поведение CommandBehavior) в C: \ Users \ sam \ Рабочий стол \ 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();) снова, в потоке, где performd фоновой задачи (до начала DatabaseContext), и есть другое исключение в настоящее время:

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

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

+0

Какое фактическое исключение? –

+0

NullReferenceException –

+0

Вы подтвердили, что не передаете значение null в любую из этих функций? –

ответ

1

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

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

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

string connectionString = connection.StoreConnection.ConnectionString; 
Смежные вопросы