2012-01-24 101 views
1

我們在Windows Azure環境中使用Entity Framework,直到現在我們都在使用InProc會話狀態,但正如您可能知道的那樣,由於它的分佈式特性,我們應該使用另一種方法,這就是我們激活Azure AppFabric Cache的原因。Session Azure Cache中的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 
... 

這似乎異常被拋出時的AppFabric嘗試序列的EF對象緩存。

我們使用EF,LazyLoading和ProxyCreation標誌都處於活動狀態,這似乎在此方案中不受支持,但它在InProc會話狀態管理中。

我們正在尋找一些關於如何在使用EF的同時使用Azure AppFabric會話狀態提供程序的建議,同時保持延遲加載。

感謝, 瑞

回答

3

不能使用延遲加載和動態代理與任何類型的會話。如果它與InProc一起工作,那麼它可能是由於EF上下文生命週期的無效處理,或者您只是幸運,並且僅在其上下文的範圍內訪問了緩存對象。

延遲加載需要生活環境,環境應該只能用於執行單個工作單元。因此,您無法支持緩存實體的延遲加載。不應該代理緩存的實體(代理對他們沒有意義),必須分離。

+0

感謝您的回答,關於它在使用InProc會話時的工作情況,我唯一的猜測是序列化以不同的方式完成,因爲它似乎是引發錯誤的地方,而且我們在項目是從InProc到Azure緩存的Session配置,所有其他邏輯都是相同的。 由於我們仍然希望進行延遲加載,因此可以將實體存儲在會話中嗎?如果是這樣,那麼做的方式是首先將它們分開?我們怎麼做到這一點? – Rui

+0

InProc會話不使用任何序列化。它只是持有對現有對象的參考。你可以簡單地通過在上下文中調用'Detach'來分離實體,但是一旦你做了它,它將不允許延遲加載,這就是重點 - 存儲在會話中的實體以後不能使用延遲加載。 –

+0

據我所知,緩存後,這些實體上的延遲加載不再可用。在發送實體到會話之前簡單地調用detach似乎沒有工作。爲了更清楚地說明,我現在的目標是在保持其餘邏輯中的延遲加載的同時,有能力存儲一些EF實體與基本屬性(實際POCO)進行會話。你是否知道在不創建新類的情況下實現這一目標的方法? – Rui