2012-01-24 2 views
1

우리는 Windows Azure 환경에서 Entity Framework를 사용하고 있으며 지금까지 InProc 세션 상태를 사용하고 있었지만 일부는 알 수 있듯이 분산 된 특성으로 인해 다른 방법을 사용해야합니다 Azure AppFabric Cache를 활성화 한 이유입니다.세션 Azure 캐시의 EF 동적 프록시

우리는 다음과 같은 예외를 느끼기 시작하고이 세션 상태 제공자를 활성화하는 경우 : AppFabric 캐시에 EF 객체를 직렬화 할 때

ObjectDisposedException: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.] 
     System.Data.Objects.ObjectContext.EnsureConnection() +11658009 
     System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +66 
     System.Data.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption) +271 
     System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad() +499 
     System.Data.Objects.Internal.LazyLoadBehavior.LoadProperty(TItem propertyValue, String relationshipName, String targetRoleName, Boolean mustBeNull, Object wrapperObject) +136 
     System.Data.Objects.Internal.<>c__DisplayClass7`2.<GetInterceptorDelegate>b__1(TProxy proxy, TItem item) +153 
     System.Data.Entity.DynamicProxies.SysUser_1A4439A55EAE70AD5C976139AA3A390B54A2C96E5FA605B3F364F0ADF52D0707.get_Assignments() +151 
     WriteSysUser_1A4439A55EAE70AD5C976139AA3A390B54A2C96E5FA605B3F364F0ADF52D0707ToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract) +544 
... 

이 예외가 발생 될 것으로 보인다입니다.

LazyLoading 및 ProxyCreation 플래그가 모두 활성화 된 EF를 사용하고 있으며이 시나리오에서는 지원되지 않는 것 같지만 InProc 세션 상태 관리에있었습니다.

지연로드를 유지하면서 Azure AppFabric 세션 상태 공급자를 EF와 함께 사용하는 방법에 대한 제안 사항을 찾고 있습니다.

감사합니다, 루이

답변

3

당신은 세션이 어떤 종류의 지연로드 및 동적 프록시를 사용할 수 없습니다. InProc과 함께 작동하는 경우 EF 컨텍스트 수명이 잘못 처리되었거나 행운이있어 캐시 된 객체에 컨텍스트의 범위에서만 액세스했습니다.

지연 성 로딩은 라이브 컨텍스트가 필요하며 컨텍스트는 단일 작업 단위 (UU)를 수행하기 위해서만 존재해야합니다. 따라서 캐시 된 엔티티에서 지연로드를 지원할 필요가 없습니다. 캐쉬 된 엔티티는 프록시 화되어서는 안되며 (프록시가 그 프록시를 이해하지 못함) 분리되어야합니다.

+0

InProc 세션을 사용할 때 작동하는 것에 대한 답변을 주셔서 감사합니다. 유일한 방법은 직렬화가 다른 방식으로 수행된다는 것입니다. 오류가 발생한 곳인 것처럼 보이기 때문에 우리는 프로젝트는 InProc에서 Azure 캐시에 이르는 세션 구성이었고 다른 모든 논리는 동일합니다. 우리는 여전히 게으른 로딩을 원하므로 세션에서 엔티티를 저장할 수 있습니까? 그렇다면, 그것을하는 방법은 먼저 그들을 분리 무엇입니까? 어떻게 할 수 있니? – Rui

+0

InProc 세션은 직렬화를 사용하지 않습니다. 기존 객체에 대한 참조 만 보유합니다. 컨텍스트에서 'Detach'를 호출하여 엔티티를 분리 할 수는 있지만 한번만 수행하면 더 이상 지연로드가 허용되지 않으며 세션에 저장된 포인트 엔티티가 나중에 지연로드를 사용할 수 없습니다. –

+0

캐싱을 한 후에는 해당 항목에 대한 지연로드가 더 이상 사용할 수 없다는 것을 알고 있습니다. 엔터티를 세션에 보내기 전에 detach를 호출하기 만하면 작동하지 않는 것 같습니다. 좀 더 명확히하기 위해, 이제는 논리의 나머지 부분에서 게으른로드를 유지하면서 기본 속성 (실제 POCO)과 세션에 일부 EF 항목을 저장할 수있는 기능을 제공하는 것이 목표입니다. 새로운 수업을 만들지 않고이 목표를 달성 할 수있는 방법을 알고 있습니까? – Rui