0

我在我的项目中使用实体框架和通用存储库。

以下是我的存储库中的一种方法。

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

当我在 WCF 服务中使用此方法时,我想包含该 DbSet 的某些导航属性。例如,

List<Countries> GetCountries()
{   
    return this.repository.GetQuery<Countries>().Include("Cities").AsEnumerable().ToList();
}

这应该返回导航属性中包含城市的所有国家/地区。

目前这给出了一个错误,说底层连接已关闭...

为了实现这一目标,您预计要做哪些改变?

谢谢

4

2 回答 2

0

首先重写您的 GetQuery 方法以直接使用 DbContext。ObjectContext 的 GetQuery 方法旨在使用类似 SQL 的语法来查询数据存储。

你在这里做了很多你不需要的事情。由于您从 DbContext 派生类开始,只需使用 dbContext.Set() 来检索实体类型的 DbSet,然后对 DbSet 对象使用 Include(path) 方法。

存储方法:

public IQueryable<TEntity> GetQuery<TEntity>( string includePath = null )
{
    var dbSet = DbContext.Set<TEntity>();

    if( !string.IsNullOrWhitespace( includePath ) )
    {
        return dbSet.Include( includePath );
    }

    return dbSet;
}

用法:

List<Countries> GetCountries()
{   
    return this.repository.GetQuery<Countries>( "Cities" ).ToList();
}
于 2013-03-25T23:23:29.320 回答
0

升级到 EF 5.0 代码生成器模板已解决此问题。

于 2013-03-29T13:05:43.583 回答