2011-12-24 6 views
1

나는이 오류가 무엇입니까 후 데이터 개체에 액세스 할 수 없습니다은 처분 심지어 목록 불구하고

... 
ViewData["AdSlots"] = dbc.AdSlots.Where(a => a.PublisherId == publisherId).ToList(); 
dbc.Dispose(); 

내가보기에이 코드를 사용하는 경우 :

grid.Column(header: "Ad Size", style: "ad-size", format: @<text>@item.AdSize.Width x @item.AdSize.Height</text>), 

이것은 MVC3 btw에 있습니다.

왜 이런 일이 일어나는 지 알고 계십니까? 그것은 기억에 저장되어서 일하지 않아야합니까? 아니면 협회가 유지하기를 원하는 것을 명시 적으로 언급해야합니까?

감사

+1

당신은 그것을 처분했는데, 왜 당신은 그것에 접근 할 수 있어야한다고 생각합니까 ??? 가비지 컬렉션이없는 언어에서는 일반적으로이 문제를 해결할 수 있지만 여전히 가끔씩 매우 불만스러운 프로그래밍이 있습니다. 쓰레기 수거 언어에서는 붐을 일으킬 확률이 훨씬 높습니다. –

+1

나는 그것을 목록으로 바꿨다 ... 기억에 남지 말아야 하는가? – Darren

+0

처분을 사용했습니다. 구성 요소가 사라졌습니다. –

답변

5

문제는 당신이 AdSolts에 대한 데이터베이스를 조회하는 즉시 폐기된다는 것이다. 그런 다음 코드에서 AdSize에 액세스하려고 시도하지만 데이터베이스에 다시 액세스하려고 시도하지만 Linq-SQL AdSize의 느린 로딩 특성 덕분에 처음으로로드되지 않고 데이터 컨텍스트가 삭제 된 이후로 그 예외.

DataLoadOptions을 사용하여 문제를 해결할 수 있습니다.

List<AdSlot> list; 
using(var dbc = new DbDataContext()) 
{ 
    var loadOptions = new DataLoadOptions(); 
    loadOptions.LoadWith<AdSlot>(n => n.AdSize); 
    dbc.LoadOptions = loadOptions; 

    list = dbc.AdSlots.Where(a => a.PublisherId == publisherId).ToList(); 
} 

ViewData["AdSlots"] = list; 
1

그래서 이제 epignosisx에서 게시 한 것과 동일한 코드를 남겨두고 loadoptions를 제거하면 어떻게 될지 궁금하십니까? 그 목록을 새로운 변수에 넣고 있기 때문에?