2017-03-07 4 views
0

J'ai vu de bonnes sources sur Repository Pattern comme la vidéo Repository Pattern with C# and Entity Framework, Done Right et Aspnet Boilerplate. Je sais que le référentiel ne devrait pas avoir de logique pour commettre des données, ce qui est la responsabilité de l'unité de travail. Mais il me semble un peu de l'excès de poids en supprimant l'enregistrement parent avec les enfants, car vous devrez peut-être lire le parent, tous ses enfants, pour ensuite supprimer. Vous pouvez voir un exemple d'implémentation comme cela, en utilisant Entity Framework dans la même vidéo, deleting authors and course. Le Boilerplate Aspnet a a implementation to delete with a primary key, which read the entity before deleting too. Donc, je demande: puis-je utiliser une commande de suppression et toujours respecter le modèle? Y a-t-il un bon exemple?Supprimer doit être lu en premier dans le modèle de référentiel?

+0

Utilisez [stub entities] (http://stackoverflow.com/a/28261869/861716). –

Répondre

1

Je ne vois pas comment cela pourrait être un problème si vous injectez un contexte par requête ou plutôt une unité de travail dans ce cas, puisque c'est le même contexte dans toute la requête actuelle, vous pouvez simplement supprimer le parent et mis en cascade pour ses enfants, quelque chose comme:

var product = new Product { Id = productId }; 
db.Entry(product).State = System.Data.Entity.EntityState.Deleted; 
db.SaveChanges(); 

de cette façon, vous faites une lecture moins, en plus de cela jeter un oeil à des composants comme MediatR, et pourquoi you don't even need a repository si vous utilisez un ORM.

+0

Certaines personnes soutiennent que l'utilisation de DbContext pourrait suffire aux besoins du référentiel. J'étudiais cette vidéo, de Mosh, qui montre que DbContext n'est pas une bonne solution: https://youtu.be/rtXpYpZdOzM?t=5m3s Quoi qu'il en soit, ma question a toujours le même problème: Pour implémenter le référentiel , J'ai toujours besoin de lire une entité avant de supprimer? Comment est-ce que je pourrais employer la commande de suppression, ainsi j'irai à la base de données seulement une fois? Votre solution est bonne pour éviter la lecture des enfants, mais lit toujours le parent. – mqueirozcorreia

+1

Ma solution ne lit pas le parent, il informe une instance du parent avec l'identifiant d'un existant, et l'efface sur SaveChanges, en termes d'efficacité, il n'y a pas d'autre moyen, encore une fois la meilleure pratique est de ne pas Utilisez un modèle de conception lorsque vous n'en avez pas besoin, mais le but de l'unité de travail est d'avoir une transaction atomique, que vous avez déjà avec le contexte db qui est une implémentation du modèle d'unité de travail. –

+0

Merci! Bonne solution et certaines personnes ont donné cet exemple ici aussi http://stackoverflow.com/a/37802938/3424212 – mqueirozcorreia