Каков наилучший способ записи данных через MVC в базу данных? - PullRequest
3 голосов
/ 23 апреля 2019

Я работаю над проектом домашней работы, используя MVC с EF Core.Я ищу лучший способ записи данных в базу данных.(Я начинающий) Есть две таблицы.Predbilježba (Зачисление) и Семинары (Семинары)

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 Status { 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> Predbilježba { get; set; }
}

Мне нужно вставить своего рода Зачисление (названный: Predbilježba) в базу данных.Регистрация связана с таблицей, которая называется «Семинары» («Seminari»).

Поэтому, когда человек «записывается» на «семинар», ему / ей необходимо вставить основные данные в форму (имя, номер телефона,и т. д.) и им нужно выбрать «семинар» из списка проведенных семинаров, которые находятся в таблице «Семинар».

Поэтому, когда они нажимают «Сохранить», их основные данные записываются в «Predbilježba / (англ. Enrollment)» вместе с выбранным «семинаром»

Так что у меня уже есть контроллеры для этих 2 моделейи соответствующие представления для создания, редактирования и т. д.

У меня такой вопрос: создать ли отдельный контроллер / модель / представление для вставки данных в таблицы?Может кто-нибудь привести пример того, как это делается

Ответы [ 6 ]

2 голосов
/ 23 апреля 2019

Если я правильно понимаю ваш вопрос, вы спрашиваете о хорошем архитектурном проекте. Не так ли? (если нет, пожалуйста, дайте мне знать, чтобы отредактировать ответ).

У вас есть много архитектурных решений и возможностей. Самый простой для вас - это архетектурный паттерн Service-Repository. Я бы здесь опускал слово Repository, потому что EF уже (на мой взгляд) реализация шаблона Repository (хотя бы частично).

Итак, для простоты вы хотели бы начать с Сервисный архитектурный шаблон . Что касается создания класса, который вставляет DbContext в свой consttructor (назовем его PredbilježbaService). И в этом классе вы обрабатываете все операции вашей логики (включая запросы к базе данных EF).

Затем вы внедряете этот класс в свой контроллер и вызываете необходимые функции из этого класса обслуживания (который имеет дело с базой данных) в вашем контроллере.

Тот же процесс может быть применен к другой сущности Seminar.

P.S. под инъекцией я имею в виду использование любого шаблона проектирования IoC (в ASP.Net Core внедрение зависимостей уже встроено).

Итак, после этих коротких слов, , чтобы ответить на ваш вопрос напрямую, да , хорошим дизайном программного обеспечения будет создание отдельного класса, который обрабатывает операции с базой данных (добавление строк, редактирование строк). и т. д.)

1 голос
/ 23 апреля 2019

Все зависит от того, что должно делать ваше приложение.

Если это не более чем несколько представлений вокруг нескольких таблиц, тогда совершенно нормально сохранить эти объекты непосредственно из контроллера.Лучший дизайн, как правило, самый простой, и нет необходимости слишком усложнять вещи слоями, архитектурными узорами и так далее.Они актуальны, когда размер проекта намного больше, чем в вашем случае.

Хороший дизайн - это все о коммуникации.Если кто-то еще должен поддерживать ваш проект, ему будет ясно, где найти функциональность?

Я бы ожидал двух контроллеров: один для семинаров (называемый SeminarController) и один для регистрации (называемый EnrollmentController).У них будут методы для просмотра, вставки, изменения и удаления данных.Я мог бы легко расширить ваш проект, потому что я знаю, где (и как) найти код.Так что ваше предложение кажется подходящим.


Ответ на комментарий

В списке семинаров есть ссылка, указывающая на экран, где кто-то может зарегистрироваться длясеминар.Это действие должно знать, какой семинар был выбран.Способ сделать это - передать идентификатор семинара вместе с запросом, например, /Enrollment/Register/{seminar id}.Это приводит к GET-запросу.Форма в представлении регистрации отправит введенные данные обратно в контроллер.

В EnrollmentController у вас будет что-то вроде этого:

private readonly MyDbContext context;

// Constructor and other methods omitted

[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");
}

В зависимости от требований, вы можетенеобходимо вставить некоторые проверки и т. д.

0 голосов
/ 23 апреля 2019

Чтобы уточнить, мне нужно сделать страницу пользователя, на которой пользователь может «зарегистрироваться» на «семинар», написав имя, фамилию и т. Д. И выбрав нужный семинар. На данный момент у меня есть функциональная база данных, личность (которая будет использоваться позже в проекте), контроллеры обеих моделей и соответствующие представления, где я могу редактировать Prebilježbe (англ. Enrollments) и семинары.

Изображения страницы следуют: Image1 Image2 Image3 Image4

Таким образом, когда пользователь нажимает Upiši se (англ. Enroll), как показано на изображении № 3., этот выбранный семинар вместе с базовой информацией, которая открывается после щелчка (изображение 4), необходимо записать в базу данных «Predbilježbe» (англ. Учащиеся)

Эта страница "Upis" будет страницей пользовательского ввода, а "Seminari" и "Predbilježbe" будут страницами администратора.

0 голосов
/ 23 апреля 2019

Вам нужно немного изучить архитектуру программного обеспечения, чтобы прояснить это.Попробуйте прочитать о Layered Architecture для базовых структур, и я предполагаю, что вы уже понимаете, как работает MVC архитектура .Это позволит уточнить, где выполнять какую задачу.Одна из моих любимых - луковая архитектура .Таким образом, в основном, когда вы реализуете архитектуру в своем коде, становится намного проще читать, контролировать и отслеживать все действия, выполняемые в коде.

В самом простом лучше разделить задачи, как показано ниже:

1. You define your model classes 
2. You create a database class/layer, where you will implement the logic to perform data base queries into your database with respect to the models and return the formatted data (This is where you perform the EF core queries).
3. You create your controllers, where you handle tasks by sending appropriate requests to the database layer and fetch the formatted data.
4. You create your views based on the expected model, and setup the controllers to send the formatted model data to the appropriate view. 

Хорошее место для начала здесь: Учебник по ядру EF с MVC

0 голосов
/ 23 апреля 2019

Что вы хотели бы сделать, это создать реализацию на основе DbContext

0 голосов
/ 23 апреля 2019

Лучший способ добиться этого в MVC - использовать пакет nuget EntityFrameworkCore

Вот пошаговая документация: https://docs.microsoft.com/en-us/ef/core/get-started/

По любым дополнительным вопросам не стесняйтесь спрашивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...