使用IQuarable的实体框架通用存储库实现

时间:2011-08-05 14:32:02

标签: entity-framework-4

实体框架自引入版本1以来发生了巨大变化.EF 4.1改进了Code First和Fluent映射,这些映射确实令人印象深刻。但是,我担心EF 4.1上的复杂查询实现,因为它强烈依赖于DbContext。实体SQL和Linq to Entities继续使用SQL查询更改它的行为。我觉得我们需要像HQL或Criteria这样强大的查询机制来克服这个问题。你怎么想?

2 个答案:

答案 0 :(得分:1)

许多现代.NET ORM提供IQueryProvider实现(包括NHibernate)。我选择通过使用POCO T4模板删除对EF的直接依赖,然后修改它以生成返回纯IQueryable而不是ObjectSets的接口(IMyRepository)。使用ObjectContext的IMyRepository的底层实现。如果我们决定放弃EntityFramework,我们可以改变IMyRepository的实现来使用别人的LINQ IQueryProvider。

此外,这允许我们在分布式场景中工作。例如,IMyRepository的一个实现存在于客户端上,并使用DataServiceClient(WCF数据服务)调用服务器,该服务器具有不同的IMyRepository实现,它直接使用实体框架。

在Code First的情况下,这也很容易做到。你的类已经是POCO ......所以只需让你的DbContext实现一个返回IQueryables而不是DbSets的接口。

我个人然后使用依赖注入注入IMyRepository。

答案 1 :(得分:0)

My Generic存储库如下所示

public class Repository<TEntity, TPrimaryKey>: IRepository<TEntity, TPrimaryKey> where TEntity : class
{
    public IQueryable<TEntity> GetQuery()
    {
        return this.UnitOfWork.GetQuery<TEntity>();
    }       
    public IQueryable<T> LoadType<T>() where T : class
    {
        return this.UnitOfWork.GetQuery<T>();
    }
}

我的工作单位在这里

public class UnitOfWork
{
    /// <summary>
    /// Gets the query.
    /// </summary>
    /// <typeparam name="TEntity">The type of the entity.</typeparam>
    /// <returns></returns>
    public IQueryable<TEntity> GetQuery<TEntity>() where TEntity:class 
    {
        return this.DbContext.Set<TEntity>();
    }        
}