0

基本的に、EF モデルへのアクセスを制御するリポジトリがあります。参照を作成し、アクセスされているリポジトリに応じて、要求されたエンティティを返します。現在、ライブ ObjectContext からエンティティを直接返す IQueryable Get メソッドを公開しています。ObjectContext の使用を using ステートメント内にラップして、適切に破棄されるようにすることをお勧めしますが、リポジトリからこれを行うと、コントローラーがロードするまでに ObjectContext が既に破棄されているというエラーが表示されます。using を削除したところ、問題なく動作しましたが、通常はどのようにアプローチすればよいか知りたいです。さまざまなコマンドを実行する必要がある可能性があるため、IQueryable の戻り値を維持したいと考えています。助言がありますか?複数の HTTP 要求が着信し始めた場合、EF は開いている接続にヒットするのを防ぐのに役立ちますか?

エラー出力:

public IQueryable<IUser> Get
    {
        get
        {
            using (var context = new DrinkersPassportEntities(_connString))
            {
                return context.Users.AsQueryable();
            }
        }
    }

動作しますが、夜は眠れません:

public IQueryable<IUser> Get
    {
        get
        {
            var context = new DrinkersPassportEntities(_connString);
            return context.Users.AsQueryable();
        }
    }

現時点で私のコントローラーが行っているのはこれだけです:

    public ViewResult Index( )
    {

        return View(userRepo.Get);
    }
4

2 に答える 2

1

リポジトリが Queryables を返すべきではないと言う人もいますが、私はそれを受け入れません。

実際に ObjectContext を確実に破棄する必要があります。そうしないと、メモリ リークが発生する可能性があります (特に、すべての実体化されたエンティティを保持しているため)。

一般的な解決策は、要求ごとの ObjectContext の有効期間を使用することです。つまり、ObjectContext を ASP .NET の Request オブジェクトに格納し、HttpApplication.EndRequest イベントを処理するときに、ObjectContext を破棄します。

于 2011-04-21T00:08:17.963 に答える
0

確かに安全です。多くの人がスタブアウトして、データ アクセス用に 2 ~ 3 層を用意しています。最終的には、コードがクリーンであることを確認するだけです。オブジェクトをどのように取得するかはあなた次第であり、実用的であることが最善の方法だと思います. 再利用される特定のクエリを抽象化するのに役立つ特定のタイプの単一のリポジトリ/サービス クラスを持つことは素晴らしいことだと思いますが、コントローラーでコンテキストを直接公開するのに時間はかかりません。

于 2011-04-21T00:27:19.310 に答える