2012-01-20 16 views
10

Estoy escribiendo un repositorio genérico para marco de la entidad y estoy confundido en cuanto a cuál es la diferencia entre estas llamadas son:Diferencias entre .CreateObjectSet <T>,. Set <T> y .CreateQuery <T>?

ObjectContext.CreateObjectSet<T> 
ObjectContext.CreateQuery<T> 
DbContext.Set<T> 

Quiero un repositorio genérico que ambos soportes contexto generado a partir de archivos .edmx así como código de primeros DbContext, así que tengo esto:

public abstract class EntityRepository<TClass> 
    where TClass : class, new() 
{ 
    //private readonly TContext _context; 
    private readonly ObjectSet<TClass> _objectSet; 

    protected EntityRepository(IObjectContextAdapter context) 
    { 
     _objectSet = context.ObjectContext.CreateObjectSet<TClass>(); 

    } 

    protected EntityRepository(ObjectContext context) 
    { 
     _objectSet = context.CreateObjectSet<TClass>(); 
    } 

    public ObjectSet<TClass> Query() 
    { 
     return _objectSet; 
    } 
} 

En los ejemplos que he visto en línea que he visto todo 3 utilizadas, lo que es las diferencias reales entre ellos? ¿Es un mejor rendimiento sabio? Sé que puedes escribir consultas LINQ contra los contextos usando los 3 métodos.

Respuesta

16

CreateObjectSet<T> devuelve ObjectSet<T> que es básicamente una colección de objetos T, con la capacidad de agregar, eliminar, ... objeto de estas colecciones que luego se inserta, elimina, ... También puede usarlo para consultar. Es como una raíz de nivel superior para una entidad determinada.

El CreateQuery<T> le da ObjectQuery<T>, que puede ser visto como IEnumerable<T> (también IQueryable<T>). Este objeto es como un subconjunto de ObjectSet<T> (algunas condiciones, etc.), pero no puede agregar elementos a él, etc.

Y finalmente el Set<T> devuelve DbSet<T> que es la versión simplificada del primer método/objeto para Code First. Es más fácil, por ejemplo, utilizar estos objetos (o mejor dicho, interfaces; IDbSet<T>) para, por ejemplo, pruebas unitarias, etc. Similar a lo que son ObjectContext y DbContext.

+0

¿Realmente no hay diferencias de rendimiento al ejecutar consultas en la base de datos para cada uno de estos? En mi caso, dado que mi Repositorio no está almacenando el contexto real, ¿diría que fui por el camino correcto de elegir ObjectSet para poder realizar todas las operaciones CRUD con él? – SventoryMang

+2

Fundamentalmente y ObjectSet : ObjectQuery . Si crea su consulta usando uno u otro no afecta la ejecución de la consulta. Hay una sobrecarga mínima en la llamada a CreateObjectSet en comparación con CreateQuery (hacemos algunas búsquedas de metadatos) pero me sorprendería si esta sobrecarga tuviera algún impacto observable en el mundo real. La implementación del conjunto en la API DbContext es realmente una capa delgada sobre los otros métodos. Tampoco debería tener un impacto significativo, y DbContext en su conjunto es mucho más simple y fácil de usar API. – divega

4

Además de lo que Jiri ya explicó, hay una sobrecarga de CreateObjectSet que no toma argumentos. Esta sobrecarga supondrá automáticamente que debe devolver ObjectSet para el único EntitySet asociado a TEntity. Lanzará si el modelo tiene MEST (conjuntos de entidades múltiples por tipo). Todas las sobrecargas de CreateQuery necesitan una cadena Entity SQL para iniciar la consulta (tenga en cuenta que el nombre de un EntitySet es una consulta válida de Entity SQL).