我们正在Windows Azure环境中使用Entity Framework,直到现在我们都在使用InProc会话状态,但是正如你们中的一些人可能知道的那样,由于它的分布式特性,我们应该使用另一种方法,这就是我们激活Azure的原因AppFabric Cache。
激活此会话状态提供程序时,我们开始遇到以下异常:
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会话状态提供程序的建议,同时保持延迟加载。
谢谢, 锐
答案 0 :(得分:3)
您不能对任何类型的会话使用延迟加载和动态代理。如果它适用于InProc,则可能是由于EF上下文生命周期的无效处理,或者您只是幸运并且仅在其上下文的范围内访问了缓存对象。
延迟加载需要生存环境,而上下文应仅用于执行单个工作单元。因此,您不能要求在缓存实体上支持延迟加载。
,根本不应代理缓存的实体(代理对它们没有意义)。