64 votes

Se moquer ou simuler DbEntityEntry ou créer un nouveau DbEntityEntry

Dans le sillage de mon autre question au sujet de moqueries DbContext.Set j'ai une autre question au sujet de moqueries EF Premier Code.

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

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, je suis en cours d'exécution pour est, comment dois-je traiter le

Context.Entry(entity).State.

J'ai intervenu par le biais de ce code et il fonctionne quand j'ai un vrai live DbContext que la mise en œuvre de mon Contexte de l'interface. Mais quand j'ai mis ma fausse contexte là, je ne sais pas comment le gérer.

Il n'y a pas de constructeur pour une DbEntityEntry classe, donc je ne peux pas en créer un nouveau dans ma fausse contexte.

Personne n'a jamais eu de succès avec soit moqueur ou feindre DbEntityEntry dans votre CodeFirst solutions?

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

102voto

Diego Mijelshon Points 40314

Comme dans l’autre cas, vous devez 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 l'implémentation, vous appelez simplement SetModified .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X