Pourquoi DbContext ne pas mettre en œuvre IDbContext interface?
Pourquoi il n'y a pas de IDbContext
interface dans le Cadre de l'Entité? Ne serait-il pas plus facile de tester des choses si il y avait une interface existante avec des méthodes comme SaveChanges (), etc. partir de laquelle vous pourrez tirer de votre base de données personnalisée contexte de l'interface?
public interface ICustomDbContext : IDbContext
{
//add entity set properties to existing set of methods in IDbContext
IDbSet<SomeEntity> SomeEntities { get; }
}
- Vous pouvez toujours créer cette interface et mettre en œuvre sur votre dérivés contexte, mais il va vraiment de ne pas être très utile pour les tests unitaires.
- Ouais, je suis juste curieux de savoir pourquoi il y a cette interface n'est pas à la première place, hors de la boîte. Il n'y aurait pas besoin de le créer manuellement.
- Vous pouvez envelopper le DbContext dans un Dépôt, donc peut se moquer de la place. Encore que Ladislav points, vous devez être prudent de ne pas exposer quoi que ce soit sur le Référentiel qui serait effectuée par linq to entities / linq to sql
- c'est ma conviction qu'un contexte est plus proche d'une Unité De Travail d'un référentiel. Le référentiel est plus proche de la DbSet.
- vous avez raison, mais encore, une pension de mise en œuvre doit utiliser un contexte. Un "repo utilise/disposer d'une unité de travail" n'a pas de sens. Une "unité de travail et les utilisations ont une ou de plusieurs pensions de titres" qui fait sens. Et encore une fois, vous avez raison, un contexte qui ont un ou plusieurs DbSet. Cela nous avertir, lors de la construction d'un repo autour d'un contexte, et la construction d'une unité de travail autour de la construit repos: Nous faisons de certains redondantes chose, intégrer un modèle de conception pour le même modèle de conception... Et pourquoi faisons-nous cela? En raison de l'absence de la mise en œuvre d'origine est clair interfaces: IDbRepository est absent (ce qui serait l'unité de travail)
- Eh bien, il n'est pas une bonne idée: 100 000 développeurs peuvent créer pour elle-même/lui-même (1 000 000) fois... Il serait mieux si EF de l'équipe de soins sur accepté les design patterns et bien connu de l'unité des essais pratiques. Son' EF 6 maintenant
- Excellent pensées. J'ai effectivement abandonné l'utilisation du modèle et suis en utilisant le DbContext directement, je pense que c'est un faux-pas, de la sorte, mais garder les choses simples.
Vous devez vous connecter pour publier un commentaire.
Je vois ce
IDbContext
:Voir ce lien Et ensuite vous apporter une nouvelle classe partielle pour vos Entités Contexte Avec Cette interface.
MODIFIÉ:
J'ai édité ce post, Cela Fonctionne pour moi.
Mon Contexte
YourModelEntities est votre auto-généré classe partielle, et votre besoin de créer une nouvelle classe partielle avec le même nom, puis ajouter votre nouveau contexte de l'interface, pour cet exemple est ContextI
REMARQUE: L'interface n'est pas de mettre en œuvre toutes les méthodes, parce que les méthodes sont mises en œuvre dans votre auto-générer du code.
Je pensais aussi à ce sujet, je suppose que vous allez l'utiliser pour moqueur
DbContext
. Je ne vois aucune raison à cela, sauf que vous devrez mettre en place votre propreDbSet
manuellement dans votre de toute façon pour votre moqué de classe (et aura donc besoin de réécrire votre propre interface de toute façon).Il suffit de créer un simulacre de DbContext l'extension de votre production DbContext surchargeant les méthodes que compliquer les tests. De cette façon, toute modification de la production DbContext sont automatiquement prises en compte dans les tests, sauf pour les méthodes de remplacement. Pour toutes les autres classes qui traitent de la persistance et de prendre le DbContext juste de les étendre ainsi passer de la maquette DbContext.
Il n'y a pas de IDbContext parce que ce serait inutile, la seule mise en œuvre de celui-ci serait le DbContext.
EF équipe est aussi aller de cette façon avec IDbSet si vous regardez cette la conception de note de réunion
Pour moi, le vrai problème avec EF quand il s'agit de l'unité de test est la DbConnection dans le DbContext, heureusement, il y a L'Effort un beau projet sur codeplex qui commence à se remplir de cette.
Avec cela, vous pouvez laisser votre DbContext et DbSet est et de faire vos tests unitaires facilement.
Le seul inconvénient de cette est la différence entre fournisseurs Linq où quelques tests unitaires peuvent passer avec l'effort et non pas avec le réel backend.
Mise à JOUR avec EF7
Je maintiens qu'il IDbContext serait inutile et que le problème vient de la DbConnection.
EF7 n'aura pas un IDbContext soit, afin de faire des tests unitaires, ils sont maintenant un fournisseur de mémoire.
Vous pouvez voir Rowan Miller faisant une démo ici: Moderne des Applications de Données avec Entity Framework 7
virtual
mot-clé pour les classes de béton juste à des fins de test semble comme un peu une odeur de code