2011-04-19 5 views
0

Entity Framework 4를 사용하고 있는데 브라우저의 뒤로 버튼을 누르면 이전 페이지로 이동 한 후 그 페이지로 이동했습니다 페이지가 열립니다하지만 난 때 그 형태를 다시 제출 내가 얻을 같은 이상한 오류가 모든 종류의, EntityFramework - 뒤로 버튼을 누르고 다시 제출하면 오류가 발생합니다.

'엔티티 객체

이 문제는 어떻게 IEntityChangeTracker

의 여러 인스턴스에서 참조 할 수 없습니다 폼을 다시 제출할 때마다 새로운 db 컨텍스트가 각 요청과 함께 새로 만들어 질 때까지 그런 오류를 만들 수 있습니까? 나는 그들이 디버거에서 새로 생성되는 것을 볼 수있다!

엔티티가 추가되었다 부착되어 있다면이 상황에서 보았다 첨부 코드의 실행이 볼이 그것을 말한 전에 ...

context.Entry (단체); 엔티티를 부착 할 때

{System.Data.Entity.Infrastructure.DbEntityEntry`1[Entities.Orders.Order]} 
CurrentValues: 'context.Entry(entity).CurrentValues' threw an exception of type 'System.InvalidOperationException' 
Entity: {Entities.Orders.Order} 
OriginalValues: 'context.Entry(entity).OriginalValues' threw an exception of type 'System.InvalidOperationException' 
State: Detached 

그것은 '단독'왜 나는 오류를 얻을 것?

건배, Ian.

+2

컨텍스트가 스레드로부터 안전하지 않습니다. 당신은이 상황을 캐싱하지 않을 수 있습니다. 완료되면 컨텍스트를 삭제 하시겠습니까? –

+0

아니요 명시 적으로 처리하지는 않지만 디버거에서는 new'd라는 것을 볼 수 있습니다. –

+0

최근에 회의에 참석 한 사람이 회상을 통해 문맥 교차 요청으로 인해 이상한 문제가 발생했습니다. 파이널 라이저 신을 행복하게 만들기 위해서 using 문으로 감싸서 처리하고 다시 시도하십시오. 알맞은 출발점 이외에는 아무 것도 바꿀 수 없습니다. IDisposable을 구현하는 것은 폐기해야합니다. 또한 newd가 있기 때문에 내부에 확실한 정적 정보가 없다는 것을 의미하지는 않습니다. (내부 객체는 확실하지 않습니다. 단지 새로운 객체가 100 % 클린 상태를 보장하지 않는다는 것을 말합니다 - 특히 스레드 컨텍스트를 사용하는 경우 , etc.) –

답변

1

오류는 엔티티가 새 컨텍스트에 의해로드되었다고 말하지 않습니다. 이 오류는 엔티티가 다른 컨텍스트에 연결되어 있다고 생각합니다. 아마도 이미 처리 할 수있는 이전 요청의 컨텍스트 일 ​​것입니다. 이것은 동적 프록시의 몇 가지 나쁜 행동입니다. 즉, 폐기 된 경우에도 이전 컨텍스트에 대한 참조를 유지합니다. 이를 피하는 유일한 방법은 프록시를 사용하지 않고 (느린 로딩과 동적 변경 추적을 사용하지 않음) 객체 그래프를 깨뜨릴 수있는 엔티티를 수동으로 분리하는 것입니다 (탐색 속성은 null이됩니다).

어떻게 이런 일이 발생할 수 있습니까? 엔티티를 어딘가에 저장합니까 (예 : 세션에서)? 일단 엔티티를 컨텍스트에 연결하고 다시 버튼을 누르면 세션에 다른 컨텍스트에 연결할 수없는 엔티티가 포함됩니다.

+0

안녕하세요, 저는 ASP.net MVC 필터에서 엔터티를로드하고 컨트롤러 기본 클래스에 할당하고 있습니다. 그런 다음 컨트롤러는 _different_ 컨텍스트를 사용하는 서비스로 엔티티를 전달합니다. 컨텍스트를 주입 할 때 '웹 요청 당'수명 관리자를 사용하여 오류를 제거한 것처럼 보입니다. 이상한 것처럼 보이지만 뒤로 버튼을 누르고 정상적인 페이지 사용 대신 다시 제출할 때만이 오류를 표시해야합니다. –

관련 문제