以下代码行给出了一个错误,说“基础连接已关闭”。
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测试客户端或任何其他客户端)时似乎发生了问题
答案 0 :(得分:0)
在查看您现在发布的代码之后,我可以得出结论,确实,您的DbContext在GetQuery方法结束时被关闭,因此当您尝试使用include
时失败。您可能想要解决的问题是为params
方法设置一个可选的GetQuery
变量,该变量将包含一些属性,并在{{1}中执行包含权限方法本身。