2009-07-01 6 views
1

現在、ASP.Netの場合は、要求ごとにコンテキストが作成され(必要な場合のみ)、要求のモデルを使用し、最後に処理されますその要求。これは、クエリモデルごとに古い使用をしなくても、コンテキストを永遠に持たなくて済むことの間に、これが良いバランスであることがわかりました。今問題は、WPFでは、要求モデルのように使用できるものは何もわかりません。今のところ、同じコンテキストを永遠に(悪夢になる可能性があります)維持するか、迷惑行為であるクエリモデルごとに巨大な痛みを伴います。私はまだこれについて良い答えを見ていない。エンティティフレームワーク:WPF対ASP.Netのコンテキスト...処理する方法

私の最初の考えは、トップレベルのメソッド(Something_Clickのようなイベント処理メソッド)がコンテキストを「オープン」し、最後にそれを閉じるという、オープンとクローズ(または何でも構いません) 。 UIプロジェクトでコンテキストを認識しているものはありません(すべてのクエリは、生成されたエンティティクラスを効果的に拡張してエンティティとUIの間に擬似レイヤを作成する部分クラスのメソッドに含まれています)。エンティティレイヤがUIレイヤに依存するようにします。

私は状態プログラミングに大いに慣れていないので、本当に犠牲になっています。

追加:

私はスレッドを使用して上に読んだが、ちょうど 周りに座っ文脈で私が持っている 問題がエラーと回復です。

私はユーザ の情報を更新するフォームがあり、エラーがあります。 ユーザフォームでは という変更がコンテキスト内のユーザオブジェクトに表示されます ユーザエクスペリエンスを のすべての変更を反映させる必要がなくなりました。

ユーザーが 別のフォームに行くことにした場合はどうなりますか?これらの変更は、文脈ではまだ です。この時点で私は です。間違ったユーザ オブジェクトがコンテキスト内にあるか、 コンテキストを取得して をリセットする必要があります。私はそれが (ユーザー クラスの再読み込み方法?)ではないと思いますが、その が本当に問題を解決するかどうかはわかりません。

答えて

0

作業単位を試してみましたか?私はEFの文脈を公開せずに文脈を開いたり閉じたりできるようにする必要があったのと同じ問題を抱えていました。私は別のアーキテクチャ(私はIoCコンテナとリポジトリ層を使用しています)を使用していると思いますので、このコードを少し見せてください。私はそれが助けて欲しい

まず、それは「Something_Click」方法に来るとき、私はのようなものに見えたコードがあるだろう:私がいた場合

私のリポジトリのそれぞれにおいて
using (var unitOfWork = container.Resolve<IUnitOfWork>){ 

    // do a bunch of stuff to multiple repositories, 
    // all which will share the same context from the unit of work 

    if (isError == false)  
     unitOfWork.Commit(); 
} 

を、私はどうかを確認する必要があると思います仕事の単位で私がいたのであれば、作業単位のコンテキストを使用します。そうでなければ、私は自分自身の文脈をインスタンス化しなければならないでしょう。したがって、各リポジトリには、次のようなコードがあります。

if (UnitOfWork.Current != null) 
{ 
    return UnitOfWork.Current.ObjectContext; 
} 
else 
{ 
    return container.Resolve<Entities>(); 
} 

そのUnitOfWorkはどうなっていますか?それほど多くはありません。私はいくつかのコメントとコードを削除しなければならなかったので、このクラスを完全に動作させないでください...ここに行く:

public class UnitOfWork : IUnitOfWork 
{ 
    private static LocalDataStoreSlot slot = Thread.AllocateNamedDataSlot("UnitOfWork"); 
    private Entities entities; 

    public UnitOfWork(Entities entities) 
    { 
     this.entities = entities; 
     Thread.SetData(slot, this); 
    } 

    public Entities ObjectContext 
    { 
     get 
     { 
      return this.Entities; 
     } 
    } 

    public static IUnitOfWork Current 
    { 
     get { return (UnitOfWork)Thread.GetData(slot); } 
    } 

    public void Commit() 
    { 
     this.Entities.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     entities.Dispose(); 
     Thread.SetData(slot, null); 
    } 
} 

これをあなたの解決策に考慮するにはいくつかの作業が必要になるかもしれませんが、これはオプションになる可能性があります。

関連する問題