在EF对象上使用.Include时,底层连接已关闭错误

时间:2013-03-04 17:11:00

标签: wcf entity-framework

以下代码行给出了一个错误,说“基础连接已关闭”。

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;
        }

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测试客户端或任何其他客户端)时似乎发生了问题

1 个答案:

答案 0 :(得分:0)

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