具有实体框架存储库的泛型

时间:2011-06-09 11:54:15

标签: .net linq entity-framework generics repository-pattern

我是Entity Framework和LINQ的新手。我有以下代码,返回供应商列表

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

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

这很好用,但我知道你可以在Linq和EF中使用Generics。所以上面的代码看起来像这样...

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

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

因此我可以使用它来返回我的EF模型中的任何类型,但我不确定如何实现它。有人可以提出建议吗?

1 个答案:

答案 0 :(得分:3)

不是返回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并且具有工作单元模式。

您可以在此处阅读所有相关信息:Faking your LINQ provider