Реализация универсального репозитория Entity Framework с помощью IQuarable - PullRequest
0 голосов
/ 05 августа 2011

Entity Framework сильно изменился с тех пор, как они представили версию 1. В EF 4.1 улучшены сопоставления Code First и Fluent, которые действительно впечатляют.Однако меня беспокоит реализация сложных запросов в EF 4.1, поскольку она сильно зависит от DbContext.Entity SQL и Linq to Entities продолжают изменять свое поведение с помощью SQL-запросов.Я чувствую, что нам нужен сильный механизм запросов, такой как HQL или Criteria, чтобы преодолеть это.Что ты думаешь?

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Многие современные .NET ORM предоставляют реализацию IQueryProvider (включая NHibernate).Я решил удалить прямую зависимость от EF, используя шаблон POCO T4, а затем изменив его для создания интерфейса (IMyRepository), который возвращает простые IQueryables вместо ObjectSets.Базовая реализация IMyRepository с использованием ObjectContext.Если мы решим отойти от EntityFramework, мы можем просто изменить реализацию IMyRepository, чтобы использовать чужой LINQ IQueryProvider.

Кроме того, это позволяет нам работать в распределенном сценарии.Например, одна реализация IMyRepository живет на клиенте и использует DataServiceClient (WCF Data Services) для обращения к серверу, который имеет другую реализацию IMyRepository, которая напрямую использует Entity Framework.

В случаеКод Во-первых, это также довольно легко сделать.Ваши классы уже являются POCO ... поэтому просто заставьте ваш DbContext реализовать интерфейс, который возвращает IQueryables вместо DbSets.

Лично я затем внедряю IMyRepository с помощью внедрения зависимостей.

0 голосов
/ 05 августа 2011

Мой общий репозиторий Выглядит следующим образом

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>();
    }        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...