Обобщения с репозиторием Entity Framework - PullRequest
0 голосов
/ 09 июня 2011

Я новичок в Entity Framework и LINQ.У меня есть следующий код с возвратом списка поставщиков

    public class SupplierRepository
{
    private DataContext db = new DataContext();

    public IQueryable<Supplier> FindAllSupplier()
    {
        return db.Suppliers;
    }
}

Это прекрасно работает, но я знаю, что вы можете использовать Generics с Linq и EF.чтобы приведенный выше код выглядел примерно так ...

    public class GenericRepository
{
    private DataContext db = new DataContext();

    public IQueryable<T> FindAll<T>()
    {
        return ...
    }
}

Чтобы я мог использовать его для возврата любого типа в моей модели EF, но я не уверен, как это реализовать.Кто-нибудь может посоветовать, пожалуйста?

1 Ответ

3 голосов
/ 09 июня 2011

Вместо того, чтобы возвращать IQueryable<T>, позвольте вашему репозиторию реализовать IQueryable<T> и вместо того, чтобы помещать DataContext в репозиторий, оберните и DataContext, и репозитории в единицу работы. Ваш репозиторий может выглядеть так:

public abstract class Repository<T> : IQueryable<T>
    where T : class
{
    private readonly IQueryable<T> query;

    protected Repository(IQueryable<T> query)
    {
        this.query = query;
    }

    public Type ElementType
    {
        get { return this.query.ElementType; }
    }

    public Expression Expression
    {
        get { return this.query.Expression; }
    }

    public IQueryProvider Provider
    {
        get { return this.query.Provider; }
    }

    public abstract void InsertOnSubmit(T entity);

    public abstract void DeleteOnSubmit(T entity);

    ...
}

Я использую этот подход, чтобы эффективно скрывать мой O / RM за абстракцией, что позволяет мне проводить модульное тестирование моего приложения, в то же время позволяя использовать LINQ для моих репозиториев и имеют шаблон единицы работы.

Вы можете прочитать все об этом здесь: Подделка вашего провайдера LINQ .

...