2012-01-24 6 views
1

我々は、Windows Azure環境でEntity Frameworkを使用していますが、これまではInProcセッション状態を使用していましたが、分散している性質のため、 Azure AppFabric Cacheを起動した理由です。セッションAzureキャッシュの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のオブジェクトをシリアル化しようとしたときにスローされているようだが。

LazyLoadingフラグとProxyCreationフラグが両方とも有効なEFを使用していますが、これはこのシナリオではサポートされていないようですが、InProcセッション状態管理にありました。

遅延ロードを維持しながら、Azure AppFabricセッションステートプロバイダをEFで使用する方法に関するいくつかの提案を探しています。

おかげで、 ルイ

答えて

3

あなたがセッションのあらゆる種類の遅延読み込みと動的プロキシを使用することはできません。それがInProcと連携していたのであれば、EFコンテキストのライフタイムの無効な処理が原因だったのです。そうでなかった場合、キャッシュされたオブジェクトにはコンテキストの範囲内でしかアクセスできませんでした。

遅延読み込みは生きたコンテキストを必要とし、コンテキストは単一の作業単位を実行するためだけに存続する必要があります。そのため、キャッシュされたエンティティでの遅延ロードをサポートする必要はありません。キャッシュされたエンティティはプロキシするべきではありません(プロキシはそれらに対して意味をなさない)ので、切り離す必要があります。

+0

InProcセッションを使用しているときに動作していることについて、お答えいただきありがとうございます。唯一の推測は、エラーがスローされた場所のように見えるため、シリアル化が別の方法で行われていることです。プロジェクトはInProcからAzureキャッシュへのセッション構成でしたが、他のすべてのロジックは同じです。 まだ遅延読み込みが必要なので、エンティティをセッションに格納することは可能ですか?もしそうなら、それを行う方法は最初にそれらを切り離すことですか?どうすればそれをすることができますか? – Rui

+0

InProcセッションはシリアル化を使用しません。既存のオブジェクトへの参照だけを保持します。コンテキスト上で 'Detach'を呼び出すだけでエンティティをデタッチすることができます。しかし、一旦それを行うと、遅延読み込みができなくなり、セッションに保存されたポイントエンティティは後で遅延読み込みを使用できなくなります。 –

+0

キャッシュ後、これらのエンティティの遅延読み込みはもはや利用できないことを理解しています。エンティティをセッションに送信する前にdetachを呼び出すだけでは機能していないようです。より明確にするために、私の目標は、ロジックの残りの部分で遅延ロードを維持し、基本プロパティ(実際のPOCO)とセッションするためにEFエンティティを格納する機能を持たせることです。あなたは新しいクラスを作成せずにこれを達成する方法を知っていますか? – Rui

関連する問題