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