通过MVC将数据写入数据库的最佳方法是什么?

时间:2019-04-23 11:10:50

标签: c# model-view-controller

我正在使用带有EF Core的MVC进行家庭作业项目。 我正在寻找一种将数据写入数据库的最佳方法。 (我是乞gg) 有两个表。 Predbilježba(注册)和Seminari(研讨会)

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)。 注册已连接到名为Seminars(名称为Seminari)的表。

因此,当某人“注册”到“研讨会”时,他/她需要将基本数据插入表格(姓名,电话号码等)中,并且他们需要从给定列表中选择“研讨会” “研讨会”表中的研讨会。

因此,当他们单击“保存”时,他们的基本数据将与所选的“研讨会”一起写入“Predbilježba/(eng。报名)”

所以我已经有这两个模型的控制器,以及用于创建,编辑等的适当视图。

我的问题是:是否创建单独的控制器/模型/视图以将数据插入表中?有人可以举个例子吗

6 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则表示您在询问一个好的建筑设计。不是吗(如果没有,请让我知道编辑答案)。

您有许多架构选择和可能性。您最容易开始的一种是服务库体系结构模式。我在这里省略了Repository一词,因为EF已经(至少在某种程度上)已经是Repository模式的实现。

为简单起见,您想从服务体系结构模式开始。这是关于创建一个类的方法,该类将DbContext注入其构造函数中(让我们将其命名为PredbilježbaService)。并在此类中处理逻辑的所有操作(包括数据库EF查询)。

然后将此类注入控制器,并从控制器中的该服务类(处理数据库)中调用所需的函数。

同一过程可以应用于其他实体Seminar

P.S。注入是指使用任何IoC设计模式(在ASP.Net Core中,依赖项注入已内置)。

因此,在简短地说完后,直接回答您的问题,一个好的软件设计是通过创建一个单独的类来处理数据库操作(添加行,编辑行等)

答案 1 :(得分:1)

这完全取决于您的应用程序应该做什么。

如果这不过是围绕几个表的几个视图,那么直接从控制器保存这些对象是完全可以的。最好的设计通常是最简单的设计,并且不需要通过层,体系结构模式等使事情复杂化。当项目规模比您的情况大得多时,这些才有意义。

好的设计就是沟通。如果应该由其他人来维护您的项目,那么他们会很清楚在哪里找到该功能吗?

我希望有两个控制器:一个用于研讨会(称为SeminarController),一个用于注册(称为EnrollmentController)。这些将具有查看,插入,修改和删除数据的方法。我能够轻松扩展您的项目,因为我知道在哪里(以及如何找到)代码。因此,您的建议似乎很合适。


回复评论

研讨会列表中有一个指向指向屏幕的链接,有人可以在该屏幕上注册研讨会。该动作需要知道选择了哪个研讨会。这样做的方法是通过请求传递研讨会的ID,例如numpy。这导致了GET请求。注册视图中的表单会将输入的数据回传到控制器。

/Enrollment/Register/{seminar id}中,您将遇到类似这样的情况:

EnrollmentController

根据要求,您可能需要插入一些验证等。

答案 2 :(得分:0)

您需要研究一些软件体系结构以澄清这一点。尝试阅读有关Layered Architecture的基本结构,我假设您已经了解MVC architecture的工作原理。这些将阐明在哪里执行哪个任务。我的最爱之一是Onion architecture。因此,基本上,当您在代码中实现体系结构时,它变得更易于阅读,控制和跟踪代码内执行的所有活动。

最简单的做法是按以下方式拆分任务:

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. 

这里是一个不错的起点:Tutorial on EF core with MVC

答案 3 :(得分:0)

为进一步说明,我需要创建用户端页面,用户可以在其中写名称,姓氏等并选择所需的研讨会来“注册”到“研讨会”。现在,我有功能数据库,身份(将在项目稍后使用),两个模型的控制器以及可以在其中编辑Prebilježbe(eng。Enrollments)和研讨会的适当视图。

页面图片如下: Image1 Image2 Image3 Image4

因此,如图3所示,当用户单击Upišise(注册)时,需要将选定的研讨会以及单击后打开的基本信息(图4)写入数据库“Predbilježbe”(英语)报名人数)

此“ Upis”页面将是用户输入页面,“ Seminari”和“Predbilježbe”将是管理页面。

答案 4 :(得分:-1)

在MVC中实现此目标的最佳方法是使用nuget软件包EntityFrameworkCore

以下是分步文档:https://docs.microsoft.com/en-us/ef/core/get-started/

如有其他疑问,请随时提问。

答案 5 :(得分:-1)

您想要做的是基于DbContext

创建一个实现