4

En utilisant Entity Framework 4.1, j'essaie de créer un calque de référentiel ci-dessus en tant que test. Fondamentalement, je suis en train de jouer avec pour me familiariser comme je suis nouveau à Entity Framework et le modèle de dépôt. J'ai suivi quelques tutoriels et créé un référentiel générique. Le dépôt est lancé comme ceci:Référentiel générique Entity Framework 4.1

CentralDataRepositoryEntities CentralDataRepositoryEntities = new CentralDataRepositoryEntities(); 

Repository<Group> Rep = new Repository<Group>(CentralDataRepositoryEntities); 
IEnumerable<Group> Groups = Rep.Get<Group>(g => g.JorMGroupId == 114); 

Console.WriteLine(Group.Single()); 

Repository<Job> Rep1 = new Repository<Job>(CentralDataRepositoryEntities); 
IEnumerable<Job> Jobs = Rep1.Get<Job>(j => j.jobId == 2138); 

Console.WriteLine(Job.Single()); 

Je préférerais que si je ne devais pas lancer un nouveau dépôt à chaque fois. Est-il possible de créer le référentiel et d'utiliser des méthodes génériques à la place? E.g .:

Repository Rep = new Repository(CentralDataRepositoryEntities); 
IEnumerable<Group> Groups = Rep.Get<Group>(g => g.JorMGroupId == 114); 
IEnumerable<Job> Jobs = Rep.Get<Job>(j => j.jobId == 2138); 

Est-ce une bonne idée? Pourquoi créeriez-vous un référentiel distinct pour chaque type et quel serait le niveau de performance lors de la création de plusieurs référentiels?

Répondre

1

Juste pour clarifier: Essayez-vous de créer un référentiel "universel" qui peut être utilisé par plusieurs ORM, ou est-ce seulement pour EF? Si ce dernier est une perte de temps car un tel modèle est déjà mis en œuvre. DbContext est ce que vous appelez "Unité de travail", et la méthode Set qu'il expose, est de créer un Repository pour le type spécifié.

Un exemple:

using(var ctx = new MyContext()) // Unit of Work 
{ 
    var userRepository = ctx.Set<User>(); // Creates user repository 
    var logRepository = ctx.Set<Log>(); // Creates log repository 
    userRepository.Add(newUser); // Adds a "pending" item to the userRepository 
    logRepositor.Add(logMsg); // Adds a "pending" item to the logRepository 

    ctx.SaveChanges(); // Adds the "pending" items all at once. 
} 

en instance, je veux dire les modifications ne sont pas enregistrées dans la base de données encore.

+1

oui c'est juste pour EF. Qu'en est-il de la simulation et des tests unitaires? –

+1

@RichardBanks, Touché. – ebb

1

Avoir un tel référentiel enfreindra Single responsibility principle. Le référentiel unique ne devrait être responsable que de la gestion d'un seul type d'entité.

Ce modèle de référentiel générique ne fonctionne que pour des scénarios simples. Dans certains cas, vous aurez besoin d'une méthode supplémentaire dans le référentiel pour des entités spécifiques.

Questions connexes