在.NET中EF Core是常用ORM之一,本文中通过EF Core ORM来实现对数据库数据的增删改查,关于EF Core更多详细内容请参考微软官方文档:
入门 - EF Core | Microsoft Learn。
1. 通过Nuget包管理器添加EF Core引用
1.1 选中依赖项——>右键——>管理Nuget程序包——>输入Entity——>选中Microst.EntityFrameworkCore.SqlServer——>安装。
1.2 安装成功后。将在依赖项的包下能看到Microst.EntityFrameworkCore.SqlServer包的引用。
PS:该处作者选择的数据库为SqlServer。
2. .添加数据模型
2.1新建Models文件夹。
2.1 在Models文件夹中新建Movie类。
2.2 Models——Movie.cs 电影实体类
using System.ComponentModel.DataAnnotations;
namespace Demo.Models
{
public class Movie
{
//主键ID
public int Id { get; set; }
//标题
public string? Title { get; set; }
//发布日期
//通过DataType(DataType.Date)特性实现该字段只输入和输出日期
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
//类型
public string? Genre { get; set; }
//价格
public decimal Price { get; set; }
}
}
3. 使用.NET Core基架生成CRUD页面
3.1 在Pages文件夹下创建Movies文件夹
3.2 在Movies文件夹中创建基于Razor引擎的CURD页面
这个过程可能会自动安装一些Nuget包,请耐心等待。
通过基架生成完CRUD页面后,将在Movies文件夹下看到以下文件,对应上面选择实体类的CURD操作。
在Program.cs文件中将自动注入基架中选择的数据库上下文对象。
在appsetting.json文件中也将自动添加对应的数据库连接字符串(默认为本地连接)。
3.3 在Program.cs中通过默认路由设置默认启动页面
4. EF Core通过Code First生成数据库
4.1 在工具中找到NuGet包管理器控制台(PMC)。
4.2在控制台执行以下命令:
Install-Package Microsoft.EntityFrameworkCore.Tools
Add-Migration InitialCreate
Update-Database
4.3在执行完Add-Migration命令后,将生成Migrations文件夹。该文件夹下会包含迁移文件以及迁移快照。具体内容请参考微软官方文档:
迁移概述 - EF Core | Microsoft Learn
4.4在执行完Update-Database命令后,从视图中进入SQL Server对象资源管理器能看到根据刚才的类生成的数据库。
PS:appsetting.json文件中的(localdb)\mssqllocaldb指向的是Visual Studio自带数据库。
4.5 选中根据Movie实体生成的表,进入视图设计器查看根据Movie实体生成的表。
5. 根据基架生成的CRUD页面进行Movie表的增删改查
5.1 新增Movie表操作入口
修改Pages/Index.cshtml内容如下所示:
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">
building Web apps with ASP.NET Core</a>.</p>
<p>进入 <a href="/Movies">Movie</a>.</p>
</div>
修改后启动项目,点击Movie可进入Movie增删改查界面,项目界面如图:
5.2 新增Movie表数据
点击Create new,进入新增页面如图:
单击Create后将新增一条数据到Movie表,我们来根据这个界面分析下通过.NET Core向数据库新增数据(C)的简单用法。
在Pages/Movies/Createl中,包含前端页面文件cshtml以及后台文件cshtml.cs
asp-tag这种语法来源于ASP.NET Core 内置标记帮助程序,详情参考微软官方文档:
ASP.NET Core 内置标记帮助程序 | Microsoft Learn
在页面通过@model绑定了model文件。
form中的post指定了表单提交后会访问后台OnPostAsync方法。
input中的asp-for=“Movie.Title”表示双向绑定到Demo.Pages.Movies.CreateModel类中的Movie对象。
@page
@model Demo.Pages.Movies.CreateModel
@{
ViewData["Title"] = "Create";
}
<h1>Create</h1>
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Movie.Title" class="control-label"></label>
<input asp-for="Movie.Title" class="form-control" />
<span asp-validation-for="Movie.Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Movie.ReleaseDate" class="control-label"></label>
<input asp-for="Movie.ReleaseDate" class="form-control" />
<span asp-validation-for="Movie.ReleaseDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Movie.Genre" class="control-label"></label>
<input asp-for="Movie.Genre" class="form-control" />
<span asp-validation-for="Movie.Genre" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Movie.Price" class="control-label"></label>
<input asp-for="Movie.Price" class="form-control" />
<span asp-validation-for="Movie.Price" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-page="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
.cshtml.cs继承自PageModel。
_context为基架生成的数据库上下文,用于EF Core跟数据库进行交互。
构造函数中会注入数据库上下文。
OnGet方法会在访问该页面时被调用。
[BindProperty]
public Movie Movie { get; set; } = default!;
这句代码表示该对象与cshtml中的@model里的model进行双向绑定,前端数据发生变化时,该对象中的数据也跟着变化。该对象数据变化时,前端数据也跟随变化。
OnPostAsync()方法会在页面触发表单提交时被调用。
_context.Movie.Add(Movie);
await _context.SaveChangesAsync();
这两句代码通过EF向数据库的Movie表中添加了一条数据,并保存。
using Demo.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace Demo.Pages.Movies
{
public class CreateModel : PageModel
{
private readonly Demo.Data.DemoContext _context;
public CreateModel(Demo.Data.DemoContext context)
{
_context = context;
}
public IActionResult OnGet()
{
return Page();
}
[BindProperty]
public Movie Movie { get; set; } = default!;
// To protect from overposting attacks, see https://aka.ms/RazorPagesCRUD
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Movie.Add(Movie);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
}
}
5.3 删除、查询和修改可以在页面进行操作,具体的ASP.NET Core 内置标记帮助程序请移步:
ASP.NET Core 内置标记帮助程序 | Microsoft Learn
EF Core详情移步:
Entity Framework Core 概述 - EF Core | Microsoft Learn
该章节大致介绍了如何通过.NET8的基架实现一个Web项目的CRUD功能,以及EF Core简单实用,后续将详细介绍.NET Core Web中的其他内容。
PS:本文内容参考自微软官方文档
观众老爷们,山水有相逢,咱们下期再会。