本节中,将学习添加用于管理跨平台的SQLLite数据库中的电影的类Movie。从ASP.NET core 模板创建的应用使用SQLLite数据库。
应用模型类(Movie)配合Entity Framework core(简称EF core,这是一种对象关系映射框架(ORM),它可以简化数据访问)使用,以处理数据库
模型类称为POCO类,因为它们与EF Core 没有任何依赖关系。它定义了数据库中存储的数据属性。
一、添加数据模型“Movie”
1、右键单击“RazorPagesMovie”项目>"添加">"新建文件夹"。并命名为“Models”
2、右键“Models”文件夹,选择“添加”>"类",并将新类命名为“Movie”:
3、双击Movie.cs文件,并添加以下属性:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; //需要手动引用这个名称控件 using System.Linq; using System.Threading.Tasks; namespace RazorPagesMovie.Models { public class Movie { public int ID { get; set; } //定义数据库的主键 public string Title { get; set; } //电影名称 //DataType属性指定数据的类型是日期。通过此用法:1、用户无需在数据字段中输入时间信息(系统会自动提供一个日期控件);2、仅显示日期,不显示时间信息 //这个需要引用System.ComponentModel.DataAnnotations 名称空间 [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } //电影发行日期 public string Genre { get; set; } // 电影的流派、主题 public decimal Price { get; set; } //电影价格 } }
4、‘生成解决方法’,确保没有编译错误:
二、搭建“Movie”模型的基架
此部分,将使用基架工具生成页面,用于对“Movie”模型执行创建、读取、更新、删除操作。俗称CRUD。
1、创建Pages/Movies文件夹:
右键“Pages”文件夹>"添加">“新建文件夹”,并将新文件夹命名为“Movies”:
2、在新建的Movies文件夹上右键单击>"添加">"新搭建基架的项目"
在弹出的“添加已搭建基架的新项”对话框中,选择“使用实体框架生成Razor页面(CRUD)”之后,点击“添加”:
在弹出的“添加使用实体框架生成Razor页面(CRUD)”对话框中操作如下:
‘模型类’的下拉列表中选择“Movie(RazorPagesMovie.Models)”;
“数据上下文”中,选择+(加号),在弹出的“添加数据上下文”对话框中,将自动生成具有正确命名空间的数据库上下文类:RazorPagesMovie.Data.RazorPagesMovieContext。选择“添加”
最后,选择“添加”。
然后系统开始自动搭建基架:
上述步骤完成后,我们观察‘解决方案资源管理器’中发生了如下变化:
① appsettings.json文件:增加了用于连接到本地数据库的连接字符串
② Pages/Movies文件夹中,新增了5个文件(Create.cshtml、Delete.cshtml、Details.cshtml、Edit.cshtml、Index.cshtml),分别表示创建、删除、详细信息、编辑和索引
③ Data文件夹中,新增了1个文件:RazorPagesMovieContent.cs
④ Startup.cs文件中,更新了我们刚才新建的数据库上下文RazorPagesMovieContext:
3、初始迁移
该部分,我们将学习使用程序包管理器控制台(PMC),它用于:
添加初始迁移、使用初始迁移来更新数据库
① “工具”>“NuGet包管理器”>“程序包管理器控制台”:
② 将会默认在VS2019下方打开PMC窗口。
分别在控制台中输入以下指令:
Add-Migration InitialCreate
Update-Database
其中:migration命令,可以生成用于创建初始数据库架构的代码。该架构基于在DbContent中指定的模型;
InitialCreate参数,用于为迁移命名。可以使用任何名称。
Update命令,表示在尚未应用的迁移中运行Up方法。这种情况下,update在用于创建数据库的Migrations/
注意:这两个命令会生成同样的一个警告(其实是提示我们定义的模型类Movie中Price字段的属性decimal是没有指定的类型):
Microsoft.EntityFrameworkCore.Model.Validation[30000]
No type was specified for the decimal column 'Price' on entity type 'Movie'.…………
我们暂时忽略该警告。它将在后面的教程中得到修复。
③ 此时,观察解决方案资源管理器,发现多了如下的内容:
4、最后检查的工作,初始迁移后,检查通过依赖关系注入注册的上下文
ASP.NET Core 通过依赖关系注入进行生成。服务在程序启动期间通过依赖关系注入进行注册。需要这些服务的组件(比如这里的Razor页面)通过构造函数提供相应的服务。
基架工具自动创建DB上下文并将其注册到依赖关系注入容器。
① 检查Startup.ConfigureServices方法,添加了以下代码:
② /Data/RazorPagesMovieContext.cs文件为Movie模型协调EF Core 功能。它派生自Microsoft.EntityFramworkCore.DbContent。数据上下文指定数据模型中包含哪些实体:
上面的代码,为实体集创建DbSet属性。在实体框架术语中,实体集通常和数据表相对应,实体对应表中的行。
通过调用DBContentOptions对象中的一个方法将连接字符串名称传递到上下文。本地开发时,ASP.NET Core配置系统在appsettings.json文件中读取数据库连接字符串。
5、测试
① 按下ctrl+F5,运行程序,并在地址栏中将/movies追加到原来的URL之后:
② 点击“Create New”,在打开的添加电影记录页面中录入新的记录:
③ 可以对刚新加的电影,进行“Edit”、“Details”、“Delete”操作。
下一个文章中,我们将介绍本节中通过搭建基架生成的Razor页面,并做一些UI的改动。