0

以下代码行给了我一个错误,提示“底层连接已关闭”。

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

但如果我删除.Include(g => g.cities)它工作正常。

此代码是在我的 WCF 服务中的一项操作中编写的,我尝试使用 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;
        }

获取查询方法:

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

查看您现在发布的代码后,我可以得出结论,确实,您的 DbContext 在 GetQuery 方法结束时被关闭,因此在您尝试使用include. 您可能想要解决的问题是为方法设置一个可选params变量,该变量GetQuery将包含一些要包含的属性,并且只需在GetQuery方法本身中执行包含权限。

于 2013-03-04T19:51:13.817 回答