2012-02-27 3 views
5

내 mvc3 프로젝트에서 EF 4.2 코드를 먼저 사용합니다.MiniProfiler, EntityFramework 코드 첫 번째 및 백그라운드 작업 nullreference

miniprofiler는 잘 작동하지만 (SQL + MVC) 비동기 작업에 문제가 있습니다.

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

:

나는 위해 Application_Start에서

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(); 
    }); 
} 

내가있어 적절한 선 (? 가 확인 나는이 new DatabaseContext()에 약간의 불안이 방법 느낌이있다) '안에이 방법을 수행 Excipeion은 db가있는 첫 번째 작업 중에 던졌습니다 action(consistantUser); 여기 추적 :

MvcMiniProfiler.MiniProfiler.AddSqlTiming에서

(SqlTiming 통계) C에서 : \ 사용자 샘 \ 바탕 화면 \ MVC-미니 프로파일 \ MvcMiniProfiler \ MiniProfiler.cs : \ MvcMiniProfiler.SqlTiming..ctor (에서 라인 (274) 을 DbCommand 명령, ExecuteType C : \ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ SqlTiming.cs : 137 C : \ Users \ sam에있는 MvcMiniProfiler.SqlProfiler.ExecuteStartImpl (DbCommand 명령, ExecuteType 유형)의 137 줄에 미니 프로파일 러 프로필러를 입력합니다. \ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfilerExtensions.ExecuteStart (SqlProfiler sqlProfiler, DbCommand 명령, ExecuteType 유형)의 행 39 에서 \ MvcMiniProfiler.MiniProfiler.MbcMiniProfiler.Data.IDbProfiler.ExecuteStart (DbCommand profiledDbCommand, Exe)에서 MvcMiniProfiler \ SqlProfiler.cs : 줄 93 C : \ Users \ sam \ Desktop \ mvc-mini-profiler \ MvcMiniProfiler \ MiniProfiler.IDbProfiler.cs에서 MvcMiniProfiler.Data.ProfiledDbCommand.ExecuteDbDataReader (commandBehavior 비헤이비어)의 12 행 12 에서 C : 라인 System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands에서 System.Data.Common.DbCommand.ExecuteReader (CommandBehavior를 동작) (하여 EntityCommand하여 EntityCommand, CommandBehavior를 동작 : MvcMiniProfiler \ 데이터 \의 ProfiledDbCommand.cs \ 바탕 화면 \의 MVC-미니 프로파일)

무엇이 잘못 되었나요? 도움이 될 것입니다.

편집 : 나는 backgroung에 작업 (DatabaseContext를 시작하기 전에) performd 된 스레드에서 다시 MiniProfiler (MiniProfilerEF.Initialize();)를 초기화했는데, 지금은 다른 예외가있다 :

의 개체를 캐스팅 할 수 없습니다가 유형 '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; 
관련 문제