4 votes

Quel est le meilleur moyen d'écrire des données via MVC dans la base de données?

Je travaille sur un projet de devoir en utilisant MVC avec EF Core. Je recherche la meilleure façon d'écrire des données dans la base de données. (Je suis débutant) Il y a deux tables. Predbilježba(Inscription) et Seminari(Séminaires)

public class Predbilježba
{
    [Key]
    public int PredbilježbeID { get; set; }
    public string Ime { get; set; }
    public string Prezime { get; set; }
    public string Adresa { get; set; }
    public string Email { get; set; }
    public string Telefon { get; set; }
    public bool Statut { get; set; }

    [DataType(DataType.Date)]
    public DateTime DatumUpisa { get; set; }  
    public int SeminarID { get; set; }
    public Seminar Seminar { get; set; }
}

public class Seminar
{
    public int SeminarID { get; set; }
    public string Naziv { get; set; }
    public string Opis { get; set; }

    [DataType(DataType.Date)]
    public DateTime Datum { get; set; }
    public bool Popunjen { get; set; }
    public ICollection Predbilježba { get; set; }
}

Je dois insérer une sorte d'Inscription (Nom : Predbilježba) dans la base de données. L'Inscription est connectée à une table appelée Séminaires (Nom : Seminari).

Ainsi, lorsqu'une personne s'inscrit à un séminaire, elle doit insérer des données de base dans le formulaire (nom, numéro de téléphone, etc.) et elle doit choisir un "séminaire" dans une liste de séminaires donnés qui sont dans la table "Séminaire".

Donc, lorsqu'ils cliquent sur "Enregistrer", leurs données de base sont écrites dans Predbilježba / (Anglais : Inscription) en plus du "séminaire" choisi

J'ai déjà des contrôleurs pour ces 2 modèles et des vues appropriées pour créer, éditer, etc..

Ma question est : Dois-je créer un contrôleur/modèle/vue séparé(e) pour insérer des données dans les tables ? Quelqu'un peut-il me donner un exemple de comment cela se fait ?

Pour clarifier davantage, je dois créer une page côté utilisateur où l'utilisateur peut "s'inscrire" à un "séminaire" en écrivant son nom, prénom, etc.. et en choisissant le séminaire désiré. Pour l'instant, j'ai une base de données fonctionnelle, Identity (qui sera utilisé plus tard dans le projet), des contrôleurs pour les deux modèles, et des vues appropriées où je peux éditer Prebilježbe(Inscriptions) et Séminaires.

Les images de la page suivent : Image1 Image2 Image3 Image4

Donc, lorsque l'utilisateur clique sur Upiši se (Anglais : enroll) comme indiqué dans l'image numéro 3. , ce Séminaire sélectionné, avec les informations de base qui s'ouvrent après le clic (image 4 ) doivent être écrits dans la base de données "Predbilježbe" (Anglais : Inscriptions)

Cette page "Upis" serait une page d'entrée utilisateur, et "Seminari" et "Predbilježbe" seraient des pages administratives..

3voto

Mohammed Noureldin Points 3029

Si je comprends correctement votre question, vous parlez de bon design architectural. N'est-ce pas ? (si ce n'est pas le cas, veuillez me le faire savoir pour que je puisse modifier la réponse).

Vous avez de nombreuses options et possibilités architecturales. La plus simple pour vous de commencer est le schéma architectural Service-Repository. Je vais omettre le mot Repository ici car EF est déjà (à mon avis) une implémentation du modèle Repository (du moins partiellement).

Donc, pour simplifier, vous aimeriez commencer par le modèle architectural Service. Qui consiste à créer une classe, qui injecte le DbContext lors de sa construction (appelons-la PredbilježbaService). Et dans cette classe, vous gérez toutes les opérations de votre logique (y compris les requêtes EF de la base de données).

Ensuite, vous injectez cette classe dans votre contrôleur et appelez les fonctions nécessaires de cette classe de service (qui gère la base de données) dans votre contrôleur.

Le même processus peut être appliqué à l'autre entité Seminar.

P.S. en injectant, je veux dire utiliser un schéma de conception IoC (dans ASP.Net Core, l'injection de dépendance est déjà intégrée).

Donc, après ces quelques mots, pour répondre directement à votre question, oui, un bon design logiciel consisterait à créer une classe separate qui gère les opérations de base de données (ajout de lignes, modification de lignes, etc.).

1voto

Jeroen Points 716

Tout dépend de ce que votre application est censée faire.

Si ce n'est rien de plus que quelques vues autour de quelques tables, il est parfaitement acceptable de sauvegarder ces objets directement depuis le contrôleur. La meilleure conception est généralement la plus simple et il n'est pas nécessaire de compliquer les choses avec des couches, des modèles architecturaux, etc. Cela devient pertinent lorsque la taille du projet est bien plus grande que dans votre cas.

Une bonne conception repose sur la communication. Si quelqu'un d'autre est censé maintenir votre projet, sera-t-il clair pour lui où trouver la fonctionnalité ?

Je m'attendrais à avoir deux contrôleurs : un pour les séminaires (appelé SeminarController) et un pour les inscriptions (appelé EnrollmentController). Ils auront des méthodes pour visualiser, insérer, modifier et supprimer des données. Je serais en mesure d'étendre facilement votre projet car je sais où (et comment) trouver le code. Donc votre suggestion semble bien convenir.


Réponse au commentaire

Dans la liste des séminaires, il y a un lien pointant vers l'écran où quelqu'un peut s'inscrire à un séminaire. Cette action doit savoir quel séminaire a été sélectionné. La manière de le faire est de passer l'id du séminaire avec la requête, par exemple /Enrollment/Register/{seminar id}. Cela entraîne une requête GET. Le formulaire dans la vue d'inscription va POST les données saisies de retour vers le contrôleur.

Dans le EnrollmentController, vous auriez quelque chose comme ceci :

private readonly MyDbContext context;

// Constructeur et autres méthodes omises

[HttpGet]
public ActionResult Register(int seminarId)
{
    var seminar = context.Seminars.Single(x => x.Id == seminarId);
    return View(seminar);
}

[HttpPost]
public ActionResult Register(Enrollment enrollment)
{
    context.Enrollment.Add(enrollment);
    return RedirectToAction("index", "Seminar");
}

En fonction des exigences, vous pourriez avoir besoin d'ajouter certaines validations, etc.

0voto

Manosh Talukder Points 118

Vous devez étudier un peu les architectures logicielles pour clarifier cela. Essayez de lire sur Architecture en couches pour les structures de base, et je suppose que vous comprenez déjà comment fonctionne l' architecture MVC. Cela clarifiera où effectuer quelle tâche. Un de mes préférés est l'architecture Onion. Donc, fondamentalement, lorsque vous implémentez une architecture dans votre code, il devient beaucoup plus facile de lire, de contrôler et de suivre toutes les activités effectuées dans le code.

En gros, il est préférable de diviser les tâches comme suit:

1. Vous définissez vos classes de modèle
2. Vous créez une classe / couche de base de données, où vous implémenterez la logique pour effectuer des requêtes de base de données dans votre base de données par rapport aux modèles et renvoyer les données formatées (C'est là que vous effectuez les requêtes EF core).
3. Vous créez vos contrôleurs, où vous gérez les tâches en envoyant des demandes appropriées à la couche de base de données et récupérez les données formatées.
4. Vous créez vos vues en fonction du modèle attendu, et configurez les contrôleurs pour envoyer les données du modèle formaté à la vue appropriée.

Un bon point de départ est ici: Tutorial sur EF core avec MVC

-1voto

La meilleure façon d'atteindre cela en MVC est d'utiliser le package nuget EntityFrameworkCore

Voici une documentation étape par étape : https://docs.microsoft.com/en-us/ef/core/get-started/

Pour toutes autres questions, n'hésitez pas à demander.

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