2011-04-24 15 views
7

Busco interfaz de repositorio ef completa (y la aplicación). Tengo esto:marco de la entidad completa interfaz de repositorio

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(); 
} 

y estoy buscando una interfaz de todos los métodos incluyen SingleOrDefault y así sucesivamente.
Dónde puedo encontrar tal cosa?

+4

'SingleOrDefault()' es un método de extensión de '' IEnumerable

+0

@Bala R: lo sé, soy mira para una interfaz completa e implementación de todo IObjectSet para poder exponer todos los métodos. – Naor

Respuesta

10

Hay dos maneras de definir repositorio. La primera es mediante la exposición de IQueryable que es suficiente para hacer cualquier cosa:

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); 
} 

Tener algo como GetAll o First es simplemente redundante porque GetQuery servidores de todo. El segundo enfoque es repositorio específico donde no exponer 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); 
} 

la segunda versión se deriva entonces por las interfaces de repositorio de hormigón que se suman métodos como GetXXXOrderedByName, GetXXXWithRelatedYYY, etc.

Otro punto es que SaveChanges no es por lo general parte del repositorio, ya que puede que tenga que modificar artículos de múltiples repositorios y guardar los cambios en todos ellos por un único método. Para este propósito existe otro patrón: unidad de trabajo.

+0

Generalmente no parte, pero el contexto EF es una unidad de trabajo en sí misma. – Rushino

0

se puede encontrar una lista de todos los métodos de IEnumerable here.

0

Todo lo que tiene que hacer instalar el paquete Nuget T4Scaffolding del gestor de paquetes Nuget.

instalar este paquete a su proyecto de biblioteca de clases de modelo o de una nueva biblioteca de clases proyecto llamado repositorio

continuación, en el paquete de proyecto de biblioteca de clases de selección de modelo de consola de administrador a continuación, escriba

repositorio de andamio [DomainClasses.Alias] - DbContextType: [ContextClass]

enter image description here

te interfaz y la implementación de la clase repositorio generado para sus clases de dominio

si está utilizando Visual Studio 2015 que sugieren su uso nugetPackage T4Scaffolding.VS2015

enter image description here

si desea generalizar sus repositorios a continuación, puedes reemplazar las clases con la entidad T

para más detalles http://thedatafarm.com/data-access/using-t4scaffolding-to-create-dbcontext-and-repository-from-domain-classes/

Cuestiones relacionadas