2011-02-17 14 views
55

Siguiendo los pasos de mi otro question about mocking DbContext.Set, tengo otra pregunta sobre burlarse de EF Code First.Burlarse o fingir DbEntityEntry o crear un nuevo DbEntityEntry

ahora tengo un método para mi actualización que se parece a:

if (entity == null) 
    throw new ArgumentNullException("entity"); 

Context.GetIDbSet<T>().Attach(entity); 
Context.Entry(entity).State = EntityState.Modified; 
Context.CommitChanges(); 

return entity; 

Contexto es una interfaz de mi propia DbContext.

El problema que estoy corriendo a decir, ¿Cómo manejo el

Context.Entry(entity).State.

He recorrido este código y funciona cuando tengo un DbContext real como la implementación de mi interfaz de contexto. Pero cuando pongo mi contexto falso allí, no sé cómo manejarlo.

No hay constructor para una clase DbEntityEntry, así que no puedo crear uno nuevo en mi contexto falso.

¿Alguien ha tenido éxito con burlarse o fingir DbEntityEntry en sus soluciones CodeFirst?

¿O existe una forma mejor de manejar los cambios de estado?

Respuesta

83

Al igual que el otro caso, lo que necesita es añadir un nivel adicional de indirección:

interface ISalesContext 
{ 
    IDbSet<T> GetIDbSet<T>(); 
    void SetModified(object entity) 
} 

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

    public void SetModified(object entity) 
    { 
     Entry(entity).State = EntityState.Modified; 
    } 
} 

Así, en lugar de llamar a la aplicación, que acaba de llamar SetModified.

+0

Gracias ... Me quedé atascado pensando "¿Cómo me burlo de la entrada?" Cuando no lo necesito, solo necesito burlarme de la funcionalidad modificada ... Estoy casi avergonzado de que ahora sea tan obvio. – taylonr

+10

No se - nuestras vidas como desarrolladores están llenos de "duh!" momentos :-) –

+4

+9000 Acabo de pasar una hora investigando cómo simular clases con ctors internos y clases internas. ¡Estaba siendo frustrado en cada vuelta y la solución es tan simple! Gracias tanto al que pregunta como al que responde –

Cuestiones relacionadas