2011-04-19 3 views
4

새 프로젝트에서 POCO 엔티티와 함께 ​​Entity Framework 4.1을 사용하고 있습니다. AppFabric 캐싱을 사용하여 엔티티를 캐싱하기 전까지는 모든 것이 잘 작동했습니다. 필자는 프록시 객체를 비 직렬화하는 것과 관련된 캐시에서 entitis를 검색하는 erros를 시작했습니다. ContextOptions.ProxyCreationEnabled = false로 설정하여이 문제를 해결했습니다. 캐시에서 엔터티를 다시 가져올 때 문제가 발생했습니다. ObjectSet.Attach (엔터티)을 사용하여 현재 컨텍스트에 엔터티를 첨부하고 ObjectContext.ObjectStateManager.ChangeObjectState (엔터티, EntityState.Modified).프로그램 방식으로 엔티티 프록시 사용/사용 안 함

제 질문은 프로그래밍 방식으로 엔티티 세트에 대한 프록시를 활성화/비활성화하는 방법입니까? 즉, deserialized 엔티티를 프록시 객체로 래핑하는 방법.

좋은 방법이 없다면 지금 올바르게하고있는 것입니까? 아니면 더 좋은 방법이 있습니까?

답변

7

올바른 방법으로 사용하고 있습니다. 프록시 생성을 프로그래밍 방식으로 활성화 또는 비활성화하는 유일한 방법은 ContextOptions.ProxyCreationEnabled에서 false 또는 true으로 설정하는 것입니다.

프록시 개체에 deserialized 엔터티를 래핑하는 방법이 있다고 생각하지 않습니다. 문제는 프록시가 엔티티 유형에서 파생 된 동적으로 생성 된 유형 (런타임에 생성 된 유형)입니다. 따라서 엔티티 유형으로 역 직렬화하면 다른 유형으로 변환 할 수 없습니다.

아마도 프록시를 사용하지만 LazyLoading (ContextOptions에도 있음)을 사용 중지하고 수동으로 항목을로드하는 컨텍스트에서 항목을 분리하는 것이 효과적 일 수 있습니다. 그러나 그것은 모든 관계를 깨뜨릴 것이고 당신은 여전히 ​​엔티티를 새로운 맥락에 붙이고 그 상태를 설정해야 할 것입니다. 작동 할 수있는 또 다른 솔루션은 context.CreateObject에 의해 새로운 엔티티를 생성하고 캐시 된 엔티티에서 새로운 엔티티로 모든 데이터를 복사하는 것입니다.하지만 그것은 제가 좋아하지 않는 해결책입니다.

다른 말로 표현하면, 분리 된 엔티티로 작업하면 수동으로 상태를 첨부하고 설정해야합니다. 너가 change relations에가는 경우에 이것은 더 나쁘다.

btw. EFv4.1을 사용하여 언급했지만 사용중인 모든 것들은 EFv4입니다. EFv4.1은 ObjectContext API를 변경하지 않았으므로 DbContextObjectContext으로 다시 캐스팅하지 않는 한 다른 DbContext API를 추가하여 EFv4를 사용하고 있습니다. DbContextObjectContext으로 다시 캐스팅하면 Attach 또는 ChangeObjectState =>DbSet.Attach 및 등가물을 제공하므로 DbContext API를 확인해야합니다.

+0

고마워요! 나는 그것을 정확하게 사용하고 있는지 확실하지 않았습니다. –

관련 문제