MVC 框架 - 模型

组件"模型"负责管理应用程序的数据。它响应来自视图的请求,也响应来自控制器的指令来更新自身。

模型类可以手动创建,也可以从数据库实体生成。在接下来的章节中,我们将看到很多手动创建模型的示例。因此,在本章中,我们将尝试另一种选择,即从数据库生成,以便您对这两种方法都有实际经验。

创建数据库实体

连接到 SQL Server 并创建一个新的数据库。

连接 SQL Server

现在运行以下查询来创建新表。

CREATE TABLE [dbo].[Student]( 
   [StudentID]      INT           IDENTITY (1,1) NOT NULL, 
   [LastName]       NVARCHAR (50) NULL, 
   [FirstName]      NVARCHAR (50) NULL, 
   [EnrollmentDate] DATETIME      NULL, 
   PRIMARY KEY CLUSTERED ([StudentID] ASC) 
)  

CREATE TABLE [dbo].[Course]( 
   [CourseID] INT           IDENTITY (1,1) NOT NULL, 
   [Title]    NVARCHAR (50) NULL, 
   [Credits]  INT           NULL, 
   PRIMARY KEY CLUSTERED ([CourseID] ASC) 
)  

CREATE TABLE [dbo].[Enrollment]( 
   [EnrollmentID] INT IDENTITY (1,1) NOT NULL, 
   [Grade]        DECIMAL(3,2) NULL, 
   [CourseID]     INT NOT NULL, 
   [StudentID]    INT NOT NULL, 
   PRIMARY KEY CLUSTERED ([EnrollmentID] ASC), 
      CONSTRAINT [FK_dbo.Enrollment_dbo.Course_CourseID] FOREIGN KEY ([CourseID]) 
   REFERENCES [dbo].[Course]([CourseID]) ON DELETE CASCADE, 
      CONSTRAINT [FK_dbo.Enrollment_dbo.Student_StudentID] FOREIGN KEY ([StudentID]) 
   REFERENCES [dbo].[Student]([StudentID]) ON DELETE CASCADE 
)

使用数据库实体生成模型

创建数据库并设置表后,您可以继续创建一个新的 MVC 空应用程序。右键单击项目中的"模型"文件夹,然后选择"添加"->"新项目"。然后,选择 ADO.NET 实体数据模型。

添加新模型步骤 1 添加新模型步骤 2

在下一个向导中,选择"从数据库生成",然后单击"下一步"。将连接设置为您的 SQL 数据库。

添加新模型测试连接

选择您的数据库并单击测试连接。随后将出现类似以下屏幕。单击下一步。

添加新模型测试连接步骤 2

选择表、视图、存储过程和函数。单击完成。您将看到创建的模型视图,如以下屏幕截图所示。

新 MVC 模型

上述操作将自动为所有数据库实体创建一个模型文件。例如,我们创建的 Student 表将生成一个模型文件 Student.cs,其中包含以下代码 −

namespace MvcModelExample.Models { 
   using System; 
   using System.Collections.Generic; 
     
   public partial class Student { 
      
      public Student() { 
         this.Enrollments = new HashSet(); 
      } 
     
      public int StudentID { get; set; } 
      public string LastName { get; set; } 
      public string FirstName { get; set; } 
      public Nullable EnrollmentDate { get; set; } 
      public virtual ICollection Enrollments { get; set; } 
   } 
}