2010-04-14 4 views
2

아래 DAL 메서드에서 Cannot access object: DataContext after it's been disposed이 표시됩니다. 나는 그곳에 처분하는 것이 좋을 것이라고 생각했다. resultIEnumurable이며 이러한 종류의 문제를 일으킨 것은 IQueryable이라고 생각했습니다.LINQ Datacontext 처리 문제

내가 뭘 잘못하고 있니? 방법 이어야합니다. 내 DataContext을 처분해야합니다. 돌아 오는 것이 더 좋을까요? DataTable? 이는 SQL에서 가리키는 데스크톱 응용 프로그램입니다 2005

이 오류가 발생

예 방법 ->


public static DataTable GetEnrolledMembers(Guid workerID) 
    { 
     var DB = CmoDataContext.Create(); 

     var AllEnrollees = from enrollment in DB.tblCMOEnrollments 
          where enrollment.CMOSocialWorkerID == workerID || enrollment.CMONurseID == workerID 
          join supportWorker in DB.tblSupportWorkers on enrollment.EconomicSupportWorkerID 
           equals supportWorker.SupportWorkerID into workerGroup 
          from worker in workerGroup.DefaultIfEmpty() 
          select 
           new 
           { 
            enrollment.ClientID, 
            enrollment.CMONurseID, 
            enrollment.CMOSocialWorkerID, 
            enrollment.EnrollmentDate, 
            enrollment.DisenrollmentDate, 
            ESFirstName = worker.FirstName, 
            ESLastName = worker.LastName, 
            ESPhone = worker.Phone 
           }; 

     var result = from enrollee in AllEnrollees.AsEnumerable() 
        where (enrollee.DisenrollmentDate == null || enrollee.DisenrollmentDate > DateTime.Now) 
        //let memberName = BLLConnect.MemberName(enrollee.ClientID) 
        let lastName = BLLConnect.MemberLastName(enrollee.ClientID) 
        let firstName = BLLConnect.MemberFirstName(enrollee.ClientID) 
        orderby enrollee.DisenrollmentDate ascending, lastName ascending 
        select 
         new 
         { 
          enrollee.ClientID, 
          //MemberName = memberName, 
          LastName = lastName, 
          FirstName = firstName, 
          NurseName = BLLAspnetdb.NurseName(enrollee.CMONurseID), 
          SocialWorkerName = BLLAspnetdb.SocialWorkerName(enrollee.CMOSocialWorkerID), 
          enrollee.EnrollmentDate, 
          enrollee.DisenrollmentDate, 
          ESWorkerName = enrollee.ESFirstName + " " + enrollee.ESLastName, 
          enrollee.ESPhone 
         }; 
     DB.Dispose(); 

     return result.CopyLinqToDataTable(); 
    } 

부분 클래스 내가 DataContext를 생성 ->


partial class CmoDataContext 
{ 
    public static bool IsDisconnectedUser 
    { 
     get 
     { 
      return Settings.Default.IsDisconnectedUser; 
     } 
    } 

    public static CmoDataContext Create() 
    { 
     var cs = IsDisconnectedUser ? Settings.Default.CMOConnectionString : Settings.Default.Central_CMOConnectionString; 
     return  new CmoDataContext(cs); 
    } 

답변

7

DataContext를 삭제 한 후 CopyLinqToDataTable으로 전화를 겁니다. LINQ는 지연된 실행을 사용하기 때문에 DataContext가 삭제 된 후에 result이 열거 될 경우에만 쿼리를 실행합니다.

return 문을 포함하는 using 블록에 DataContext를 넣어야합니다.
이 문제를 피하기 위해 CopyLinqToDataTable을 호출 한 후 DataContext를 처리합니다. 예를 들어

:

using(var DB = CmoDataContext.Create()) { 
    //Execute queries 
    return result.CopyLinqToDataTable(); 
} 

using 문 단부 using 블록 에서의 DataContext를 처분 finally 블록을 생성한다. (예외가 발생하더라도)

+0

반환이 '사용 중'인 한 나는 괜찮을까요 ?? 감사합니다 –

+1

예; 괜찮아 질거야. ('IEnumerable'을 반환하지 않는다면) – SLaks

+0

호기심 때문에 'IEnumerable'은 여전히 ​​실패 할 것입니다. 그러면 어떻게 돌려 주나요? –

4

당신은 방금 대신이 작업을 수행 할 수 없습니다 Dispose

+0

'List'는'DataTable'뿐만 아니라'DataGrids' 등과도 바인딩 할 수 있습니까? 그렇다면 나는 그것을 조사 할 것이다. 내 반환 유형까지 "콘크리트"를 찾고있는 용어입니까? –

1

를 호출하기 전에 쿼리에 ToList 같은 것을 사용 하는가?

관련 문제