0

次のコード行で、「基になる接続が閉じられました」というエラーが表示されます。

return this.repository.GetQuery<Countries>().Include(g => g.Cities).AsEnumerable().ToList();

しかし、私が削除すれば.Include(g => g.cities)それはうまくいきます。

このコードは、WCFサービスの操作の1つで記述されており、WCFテストクライアントを使用してテストしようとしています。この操作をMVCアプリケーションからも呼び出してみましたが、そこでも同じ問題が発生していました。また、エンティティフレームワークでジェネリックリポジトリを使用しています

リポジトリコード(いくつかの重要な抜粋のみ)

コンストラクタ:

public GenericRepository(DbContext objectContext)
        {
            if (objectContext == null)
                throw new ArgumentNullException("objectContext");
            this._dbContext = objectContext;

            this._dbContext.Configuration.LazyLoadingEnabled = false;
            this._dbContext.Configuration.ProxyCreationEnabled = false;
        }

GetQueryメソッド:

public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
    {
        var entityName = GetEntityName<TEntity>();
        return ((IObjectContextAdapter)DbContext).ObjectContext.CreateQuery<TEntity>(entityName);
    }

試行#1 リポジトリコードに次のオーバーロードを作成しました。

public IQueryable<TEntity> GetQuery<TEntity>(params string[] includes) where TEntity : class
        {
            var entityName = GetEntityName<TEntity>();
            IQueryable<TEntity> query = ((IObjectContextAdapter)DbContext).ObjectContext.CreateQuery<TEntity>(entityName);
                foreach(string include in includes)
                {
                    query = query.Include(include);
                }
            return query;
        }

public IQueryable<TEntity> GetQuery<TEntity>(Expression<Func<TEntity, bool>> predicate, params string[] includes) where TEntity : class
        {
            return GetQuery<TEntity>(includes).Where(predicate);
        }

WCFは現在、次のコード行を実行しようとしています。

return this.repository.GetQuery<Countries>("Cities").AsEnumerable().ToList()

ただし、「基になる接続が閉じられました」という同じエラーが発生します。WCFテストクライアントでテストしました。ただし、リポジトリコードをデバッグすると、ナビゲーションオブジェクトが結果に含まれていることが示されますが、出力をクライアント(WCFテストクライアントまたはその他のクライアント)に渡そうとしているときに問題が発生しているようです。

4

1 に答える 1

0

投稿したコードを確認したところ、実際、GetQueryメソッドの最後でDbContextが閉じられているため、を使用しようとすると失敗していると結論付けることができますinclude。それを解決するためにあなたがしたいと思うかもしれないことは、インクルードされるいくつかのプロパティを取り込むメソッドのオプションのparams変数を持ち、メソッド自体GetQueryにインクルード権を与えることです。GetQuery

于 2013-03-04T19:51:13.817 に答える