Реализация универсального репозитория EntityFramework 6

entity-framework entity-framework-6

Вопрос

Мне был назначен новый проект, и я решил дать EF go.In этого проекта все, что я делаю, это получение данных, в которых нет настойчивости. Я должен реализовать некоторое кэширование, и все.

Читая о шаблонах репозитория, я нашел множество образцов кода и т. Д., Они кажутся мне неправильными. Они реализуют один-единственный объект в репозиторий.

В моем проекте мне просто нужны данные для чтения, не сохраняющие и т. Д. ... просто чтение. У меня есть объекты из 100s, которые я не могу создать репозиторий 100s, кажется, все неправильно.

Я решил начать просто, и мне все это нужно:

public interface IRepository : IDisposable
{
    IEnumerable<T> GetAll<T>() where T : class;
    IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class;
    T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class;
}

public class Repository : IRepository
{
    public IEnumerable<T> GetAll<T>() where T : class
    {
        return ???.ToArray();
    }

    public IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class
    {
        return ???.Where(predicate).ToArray();
    }

    public T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class
    {
        return ???.Where(predicate).FirstOrDefault();
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

То, с чем я борюсь, - это то, где я положил «???» это должен быть мой IdbSet.

Как я могу реализовать свой конкретный репозиторий? Будут делать какие-либо предложения или пробный образец.

большое спасибо

Принятый ответ

Во-первых, вы лучше измените GetAll() и Find() чтобы вернуть IQueryable<T> вместо IEnumerable<T> , чтобы дальнейший запрос в наборе данных был реализован с использованием Linq-to-Entities.

Начиная с реализации EF, попробуйте что-то вроде этого:

public class EFRepository : DbContext, IRepository
{
    // ctor:
    // pass a full connecting-string, or "name=someName" from configuration
    public EFRepository(string connectionStringOrName) : base(connectionStringOrName)
    {
          // init sets
          this.Entities1 = this.Set<EntityOfSomeType>();
          this.Entities2 = this.Set<EntityOfOtherType>();
    }

    public IEnumerable<T> GetAll<T>() where T : class
    {
        return this.Set<T>().ToArray();
    }

    public IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class
    {
        return this.Set<T>().Where(predicate).ToArray();
    }

    public T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class
    {
        return this.Set<T>.FirstOrDefault(predicate);
    }

    public void Dispose()
    {
        base.Dispose();
    }

    // Your DbSets...
    public IDbSet<EntityOfSomeType> Entities1 { get; set; }
    public IDbSet<EntityOfAnotherType> Entities2 { get; set; }
}

(Я использовал DbContext с предположением, что вы начинаете сначала код)




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему