1. 利用PowerDesigner进行数据库设计
1.1 确定表名
1.2 设计字段名和类型
1.3 得到PowerDesigner自动生成的数据库语句
2.构建相关的数据库
2.1 创建一个新的数据库
切换到刚才创建的数据库,新建查询,将PowerDesigner自动生成的数据库语句复制过来,执行就创建了一个新表
为表添加一行新的数据
添加的数据必须符合字段名对应的类型,不符合的话就会报错
3. 在C#中创建MVC分层
4.下载依赖包
成功后会可以看到下面的内容
5. 连接数据库
在appsettings.json中的"AllowedHosts": "*",下添加
"AllowedHosts": "*", "ConnectionStrings": { "DefaultConnection": "Server=(local)\\SQLEXPRESS;Database=需要连接的数据库名;User Id=用户账号;Password=用户密码; TrustServerCertificate=True;" }
在Program.cs中的var builder = WebApplication.CreateBuilder(args);下添加
var builder = WebApplication.CreateBuilder(args); //注册数据库的数据 builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
6. 配置Models
6.1 在Models 中创建一个类
6.2 将数据库中的表结构映射到C#的Menu.cs类上
注:Menu.cs中用的类型必须和数据库中的类型相互匹配
using System.ComponentModel.DataAnnotations.Schema; namespace WebApplicationKFC.Models { [Table("tb_menus")]//实体和数据库表进行映射 public class Menu { [Column("menu_id")]//指定属性MenuId映射到数据库表中的menu_id列 public long MenuId { get; set; }//定义了一个长整型属性MenuId,用于存储菜单的唯一标识符,通常作为主键。 [Column("restaurant_id")] public long? RestaurantId { get; set; }//类型后面跟着的?符号表示该类型是一个可空类型(Nullable Type) [Column("name")] public string? Name { get; set; } [Column("price")] public decimal? Price { get; set; } [Column("type")] public string? Type { get; set; } [Column("sales_volume")] public int SalesVolume { get; set; } } }
7. 新建一个文件夹,里面存放 A
pplicationDbContext
类
ApplicationDbContext
类是整个应用程序与数据库交互的中心点,通过这个类,你可以配置数据库连接、定义数据库中的表以及执行数据库操作。7.1创建文件夹
创建
ApplicationDbContext
类7.2 配置
ApplicationDbContext
类using Microsoft.EntityFrameworkCore; using WebApplicationKFC.Models; namespace WebApplicationKFC.Date { public class ApplicationDbContext : DbContext //定义了一个名为ApplicationDbContext的类,它继承自DbContext。 //DbContext是EF Core的核心类,负责与数据库交互,包括数据库连接的管理、数据库迁移以及对数据库查询的追踪等。 { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) //这是ApplicationDbContext的构造函数,它接受一个DbContextOptions<ApplicationDbContext>类型的参数。 //这个参数用于配置数据库连接字符串和其他数据库相关设置。 //通过依赖注入(Dependency Injection, DI)机制,ASP.NET Core会自动提供这些选项。 : base(options) //调用基类DbContext的构造函数,传入前面提到的options,初始化数据库上下文。 { } public DbSet<Menu> Menus { get; set; } //定义了数据库中的表(集合)——Menus,它与Menu实体类相对应。 //DbSet<T>是EF Core中表示数据库表的类型,T是实体类的类型。这些属性允许你通过LINQ查询等方式操作数据库中的数据。 } }
8. 配置Controllers
8.1 在Controllers新建一个MenuController.cs控制器
8.2 配置MenuController.cs控制器
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using WebApplicationKFC.Date; using WebApplicationKFC.Models; namespace WebApplicationKFC.Controllers { [ApiController] [Route("/api/[controller]")]//定义了控制器的基本路由前缀为/api/Menu,其中[controller]会被替换为控制器名(即"Menu")。 public class MenuController : ControllerBase { private readonly ApplicationDbContext _context; //context是一个只读的ApplicationDbContext实例,用于与数据库交互。 //通过构造函数依赖注入(Dependency Injection)初始化,确保了实例可以在控制器的生命周期内安全地被多个操作方法使用。 //构造方法来实现DI 系统会自动注入,注入数据库上下文的对象 public MenuController(ApplicationDbContext context) //方法参数,局部变量 { _context = context; } } }
8.3 获取数据库的所有数据
[HttpGet] public async Task<ActionResult> List() //List()方法响应HTTP GET请求,异步获取所有菜单项并返回JSON格式的数据 { var menuList = await _context.Menus.ToListAsync(); //_context是之前通过构造函数注入的ApplicationDbContext实例,它是Entity Framework Core用于与数据库交互的核心对象。 //Menus是ApplicationDbContext中的一个DbSet<Menu>属性,代表数据库中的Menus表。 //ToListAsync()方法是一个异步操作,它会查询Menus表中的所有记录,并将结果转换为一个列表(List)。 //await关键字用于等待这个异步操作完成,之后将结果赋值给menuList变量。 return Ok(menuList); //使用Ok方法将结果封装进一个HTTP响应中,表示请求成功并携带数据。 //menuList作为数据体,会被自动序列化为JSON格式(默认行为,可通过配置修改),然后随着HTTP响应一起返回给客户端。 //这里的Ok是Microsoft.AspNetCore.Mvc.ControllerBase类中的一个方法,用于生成HTTP状态码200的响应,表示一切正常。 }
结果:
测试:
打开Postman,新建一个集合
8.4 获取数据库的单一数据
[HttpGet("{MenuId}")] public async Task<ActionResult> GetByID(long MenuId) //GetByID(long MenuId)方法根据提供的MenuId查询单个菜单项,如果不存在则返回400 Bad Request状态码。 { //查询,判断是否为空 var menu = await _context.Menus.FindAsync(MenuId); //FindAsync(MenuId)方法异步查询数据库中具有指定MenuId的菜单项 if (menu == null) { return BadRequest(); //如果menu为null,表示没有找到对应ID的菜单项,方法将返回一个HTTP 400 Bad Request响应,告诉客户端请求的参数无效或资源未找到 } return Ok(menu); }
结果:
测试:
8.5 为数据库新增一行数据
//新增,参数实体前台传递json过来,EF自动封装 [HttpPost] public async Task Add([FromBody] Menu menu) //Add([FromBody] Menu menu)方法处理新建菜单项的POST请求,从请求体中接收JSON数据并将其添加到数据库中。 { _context.Menus.Add(menu); await _context.SaveChangesAsync(); //行一个异步操作来保存所有挂起的数据库更改,包括添加的新菜单项。 //SaveChangesAsync方法会将变更发送到数据库,并执行必要的SQL命令来插入新记录 }
结果:
8.6 修改数据库中的数据
//修改 [HttpPut] public async Task Update([FromBody] Menu menu) //Udate([FromBody] Menu menu)方法用于更新菜单项,接收请求体中的菜单数据并更新数据库记录。 { _context.Menus.Update(menu); await _context.SaveChangesAsync(); }
结果:
8.7 删除数据库中的数据
//删除一条 [HttpDelete("{MenuId}")] public async Task Delete(long MenuId) //Delete(long MenuId)方法根据提供的ID删除菜单项,先查询该记录,存在则执行删除操作。 { //根据id查询实体 var menu = await _context.Menus.FindAsync(MenuId); if (menu != null) { _context.Menus.Remove(menu);//API这个只是登记,没有真正操作 await _context.SaveChangesAsync();//提交 } }
结果: