完整实体框架存储库接口

Nao*_*aor 7 .net c# entity-framework repository-pattern

我正在寻找完整的ef存储库接口(和实现).我有这个:

public interface IRepository<T> where T: class
{
    IQueryable<T> GetQuery();

    IEnumerable<T> GetAll();
    IEnumerable<T> Find(Func<T, bool> where);
    T Single(Func<T, bool> where);
    T First(Func<T, bool> where);

    void Delete(T entity);
    void Add(T entity);
    void Attach(T entity);
    void SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找所有方法的接口,包括SingleOrDefault等.
哪里可以找到这样的东西?

Lad*_*nka 10

有两种方法可以定义存储库.首先是暴露IQueryable,这足以做任何事情:

public interface IRepository<T> where T: class
{
    IQueryable<T> GetQuery();

    // This method requires additional knowledge about entity
    // or more compilcated approach. The point of the method
    // is to check EF's internal storage first before querying DB 
    // T GetById(int Id);        

    void Delete(T entity);
    void Add(T entity);
    void Attach(T entity);
}
Run Code Online (Sandbox Code Playgroud)

拥有任何类似GetAll或者First简单的冗余,因为GetQuery服务器就是全部.第二种方法是特定存储库,您不公开IQueryable:

public interface IRepository<T> where T : class
{
    IEnumerable<T> GetAll();

    // Expressions!!!! Func will load all items to memeory
    // and then perform filtering by linq-to-objects!!!!!!
    IEnumerable<T> Find(Expression<Func<T, bool>> where);
    T Single(Expression<Func<T, bool>> where);
    T First(Expression<Func<T, bool>> where);

    void Delete(T entity);
    void Add(T entity);
    void Attach(T entity);
}
Run Code Online (Sandbox Code Playgroud)

然后,第二个版本由具体的存储库接口派生,这些接口添加了GetXXXOrderedByName,GetXXXWithRelatedYYY等方法.

另一点是,SaveChanges它通常不是存储库的一部分,因为您可能需要修改多个存储库中的项目并通过单个方法保存对所有这些项目的更改.为此目的,存在另一种模式 - 工作单元.