1

このクラスを考える

public class XQueries
{
    public IQueryable Query1()
    {
        using (XEntities context = new XEntities())
        {
            return something;
        }
    }

    public IQueryable Query2()
    {
        using (XEntities context = new XEntities())
        {
            return somethingElse;
        }
    }
}

データベースへの接続は、すべての(XEntities context = new XEntities()){...}に対して作成されていますか?もしそうなら、静的なUnitOfWorkクラスを作成して、接続が1つだけ存在するようにする正しい方法は何ですか?

4

2 に答える 2

1

定義上、作業単位は短命のオブジェクトであるため、静的な作業単位を作成することはできません。EFは作業単位パターンを中心に設計されているため、アプリケーションの存続期間中にObjectContext単一のインスタンスを使用することはお勧めできません。ObjectContextこれにはいくつかの理由があります。

まず第一に、このObjectContextクラスはスレッドセーフではありません。これは、あるユーザーの作業単位(たとえば、Webアプリ)の間に、別のユーザーが自分の作業単位をコミットできることを意味します。それらが同じを共有する場合ObjectContext、その状況では変更の半分だけが永続化され、変更はトランザクションではないことを意味します。運が良ければObjectContext失敗して例外をスローします。運が悪ければObjectContext、データベースとの間で安全でクラップをロードし、アプリケーションが本番環境で実行されていることを確認します(もちろん、テストとステージングの間、すべてが常に機能しているようです)。

第二に、ObjectContextは短命になるように設計されたキャッシュメカニズムを備えています。エンティティがデータベースから取得されると、ObjectContextそのインスタンスがガベージコレクションされるまで、エンティティはキャッシュに残ります。そのインスタンスを長期間存続させると、エンティティは古くなります。特に、その特定ObjectContextのインスタンスがそのデータベースに書き込んでいる唯一のインスタンスではない場合。

于 2010-08-01T13:08:40.470 に答える
0

Entity Frameworkは、クエリの実行やSaveChangesの呼び出しなど、必要な場合にのみ接続を開き、操作が完了すると接続を閉じます。

作業単位に関するMartinFowlerの著書PatternsofEnterpriseApplicationArchitectureから。

データベースにデータを出し入れするときは、何を変更したかを追跡することが重要です。そうしないと、そのデータはデータベースに書き戻されません。同様に、作成した新しいオブジェクトを挿入し、削除したオブジェクトを削除する必要があります。

オブジェクトモデルを変更するたびにデータベースを変更できますが、これにより、非常に小さなデータベース呼び出しが多数発生し、結果として非常に遅くなる可能性があります。さらに、インタラクション全体に対してトランザクションを開いておく必要があります。これは、複数の要求にまたがるビジネストランザクションがある場合は実用的ではありません。読み取りの一貫性を回避できるように、読み取ったオブジェクトを追跡する必要がある場合は、状況はさらに悪化します。

作業単位は、データベースに影響を与える可能性のあるビジネストランザクション中に行うすべてのことを追跡します。完了すると、作業の結果としてデータベースを変更するために実行する必要があるすべてのことがわかります。

クライアントにEntityFrameworkを使用する場合は常に(これはまれですが)、ObjectContextオブジェクトはシステムの作業単位の実装です。つまり、ObjectContextは上記の3つのステートメントをある程度満たします。ObjectContextを使用して完全に正しい定義に集中しすぎるのではなく、作業が少し簡単になります。

DI / IoCとリポジトリのパターンについて調査してください。これにより、問題をより柔軟に処理できるようになります。

于 2010-08-01T12:25:54.500 に答える