2011-02-15 8 views
10

Primero utilizamos EF Code y tenemos un contexto de datos para nuestra base de datos de ventas. Además, tenemos una clase que se encuentra en la parte superior de nuestro contexto de datos y realiza algunas operaciones CRUD básicas.Mocking DbContext.Set <T>()?

Por ejemplo, tenemos la siguiente función:

public static T Create<T>(int userId, T entity) where T : class, IAllowCreate 
{ 
    if (entity == null) 
     throw new ArgumentNullException("entity"); 

    using (SalesContext dc = new SalesContext()) 
    { 
     dc.Set<T>().Add(entity); 
     dc.SaveChanges(); 

     return entity; 
    } 
} 

He encontrado an example of cómo crear contextos falsos y propiedades IDBset. Empecé a implementar eso, pero me encontré con un problema.

Usamos dc.Set() bastante liberalmente (como se ve arriba) en nuestro código, mientras intentamos crear métodos genéricos CRUD. En lugar de tener un ReadCustomer, ReadContact, etc., simplemente haríamos Read(). Sin embargo, dc.Set devuelve un DbSet, no un IDbSet, por lo que no puedo simular eso.

¿Alguien ha podido simular o falsificar DbContext y seguir usando la funcionalidad Establecer?

Respuesta

11
interface ISalesContext 
{ 
    IDbSet<T> GetIDbSet<T>(); 
} 

class SalesContext : DbContext, ISalesContext 
{ 
    public IDbSet<T> GetIDbSet<T>() 
    { 
     return Set<T>(); 
    } 
} 

que utiliza un nombre diferente, pero se puede utilizar el operador new si lo prefiere para ocultar la aplicación regular.

+0

Empecé por ese camino y lo abandoné demasiado rápido. Al final tuve que agregar un GetNonTrackedDbSet() también. – taylonr

+0

Sin embargo, es solo una vez. Simplemente resúmalo como un DbContext abstracto que puedes reutilizar más tarde. –