2011-02-17 1 views
55

Suite à la suite de mon autre question about mocking DbContext.Set J'ai une autre question à propos de la moqueuse EF Code First.Mocking ou truquage DbEntityEntry ou création d'un nouveau DbEntityEntry

J'ai maintenant une méthode pour ma mise à jour qui ressemble à:

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

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

return entity; 

Le contexte est une interface de mon propre DbContext.

Le problème que je suis en cours d'exécution pour, comment puis-je gérer le

Context.Entry(entity).State.

J'ai parcouru ce code et cela fonctionne quand j'ai un réel DbContext en tant qu'implémentation de mon interface Context. Mais quand je mets mon faux contexte, je ne sais pas comment le gérer.

Il n'y a pas de constructeur pour une classe DbEntityEntry, donc je ne peux pas en créer une nouvelle dans mon faux contexte.

Quelqu'un a-t-il réussi à se moquer ou à truquer DbEntityEntry dans vos solutions CodeFirst?

Ou existe-t-il une meilleure façon de gérer les changements d'état?

Répondre

83

Tout comme l'autre cas, ce que vous avez besoin est d'ajouter un niveau supplémentaire d'indirection:

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

Ainsi, au lieu d'appeler la mise en œuvre, vous appelez simplement SetModified.

+0

Merci ... Je me suis coincé en pensant "Comment puis-je simuler l'entrée" quand je n'en ai pas besoin, j'ai juste besoin de se moquer de la fonctionnalité modifiée ... Je suis presque gêné c'est tellement évident maintenant. – taylonr

+10

Ne soyez pas - nos vies en tant que développeurs sont remplis de "duh!" moments :-) –

+4

+9000 Je viens de passer une heure à chercher comment se moquer des classes avec les internes et les classes internes. Je devenais contrarié à chaque tour et la solution est si simple! Merci à la fois le demandeur et le répondeur –

Questions connexes