3

私はEntitiesFrameworkを初めて使用し、自由な時間にそれをいじり始めたところです。私が持っている主な質問の1つは、ObjectContextsの処理方法に関するものです。

これらの中で一般的に推奨/推奨されるもの:

これ

public class DataAccess{

    MyDbContext m_Context;

    public DataAccess(){
        m_Context = new MyDbContext();        
    }

    public IEnumerable<SomeItem> GetSomeItems(){
        return m_Context.SomeItems;
    }

    public void DeleteSomeItem(SomeItem item){
        m_Context.DeleteObject(item);
        m_Context.SaveChanges();
    }
}

それともこれ?

public class DataAccess{

    public DataAccess(){ }

    public IEnumerable<SomeItem> GetSomeItems(){
        MyDbContext context = new DbContext();
        return context.SomeItems;
    }

    public void DeleteSomeItem(SomeItem item){
        MyDbContext context = new DbContext();
        context.DeleteObject(item);
        context.SaveChanges();
    }
}
4

4 に答える 4

6

ObjectContextは、「作業単位」となることを目的としています。

基本的に、これが意味するのは、各「操作」(例:各Webページ要求)に対して、新しいObjectContextインスタンスが存在する必要があるということです。その操作内で、同じObjectContextを再利用する必要があります。

トランザクションと変更の送信はすべてObjectContextインスタンスに関連付けられているため、これは考えてみると理にかなっています。

Webアプリを作成しておらず、代わりにWPFまたはWindowsフォームアプリケーションを作成している場合、Webページの読み込みで提供される厳密な「要求」スコープがないため、少し複雑になります。 、しかし、あなたはアイデアを得る。

PS:どちらの例でも、ObjectContextの存続期間はグローバルまたは一時的です。どちらの状況でも、DataAccessクラス内に存在するべきではありません-依存関係として渡される必要があります

于 2009-08-18T23:24:05.800 に答える
1

長時間実行されるプロセスに対して同じコンテキストを維持し、それに対して多くのクエリを実行すると、linq-to-sql(linq toエンティティに対してテストしませんでしたが、同じ問題だと思います)が非常に遅くなります(1秒に1クエリ)約1000の単純なクエリの後)。定期的にコンテキストを更新すると、この問題が修正され、それほど費用はかかりません。

何が起こるかというと、コンテキストはあなたがそれに対して行うすべてのクエリを追跡するので、ある意味でリセットされない場合、それは本当に太くなります...他の問題はそれが取るメモリです。

したがって、これは主に、アプリケーションの動作方法と、DataAccessインスタンスを定期的に更新するか、それともずっと同じ状態に保つかによって異なります。お役に立てれば。

ステファン

于 2009-08-17T10:12:55.110 に答える
0

簡単なメモ-2つのコード部分は、根本的な問題がほぼ同じです。これは私が見ているものです。コンテキストを開いたり閉じたりし続けたくないので(2番目の例を参照)、Microsoftがコンテキストを適切に処理することを信頼できるかどうかわからないからです。

私が行ったことの1つは、コンテキストを遅延ロードする共通の基本クラスを作成し、基本クラスのdestruct-erを実装して処理することでした。これはMVCフレームワークのようなものではうまく機能しますが、残念ながら、ビジネスオブジェクトが呼び出しを共有できるように、コンテキストをさまざまなレイヤーに渡す必要があるという問題が発生します。

最後に、Ninjectを使用してこの依存関係を各レイヤーに注入し、使用状況を追跡しました。

于 2009-08-11T18:46:33.607 に答える
0

私は常に複雑なオブジェクトを作成することに賛成ではありませんが、必要になるたびに複雑なオブジェクトを作成する必要があります。Linqto SqlのDataContextsとEFのObjectContextsは、必要なときに作成するのが最適であることがわかりました。

これらは両方とも、実行するモデルに基づいて多くの静的初期化を実行します。これは後続の呼び出しのためにキャッシュされるため、コンテキストの初期起動は後続のすべてのインスタンス化よりも長くなります。

これに直面する最大のハードルは、コンテキストからエンティティを取得すると、それを別のエンティティに戻して更新操作を実行したり、関連するエンティティを追加したりすることはできないという事実です。EFでは、エンティティを再接続できます。新しいコンテキストに。L2Sでは、このプロセスはほぼ不可能です。

于 2009-08-18T23:25:24.283 に答える