项目包含三个模板 GitHub地址
TodoItem (基础)
Models/TodoItem
Models/TodoContext
Controllers/TodoItemsController
Inventory (SqlServer)
Models/Inventory
Models/InventoryContext
Controllers/InventoriesContext
Student (SqlServer + 类似SpringBoot)
Entity/Student
Service/StudentService
Service/Impl/StudentServiceImpl
DAO/StudentContext
Controller/StudentController
TodoItem模板采用内存数据库,只能在程序运行时使用,随着程序运行的结束而销毁
在Controller文件夹下,添加新搭建基架的项目, 然后即可生成TodoController.cs文件,
需要注意:
继承了ControllerBase类,ControllerBase类是所有自定义Controller的父类;在MVC项目中,继承的是Controller类;而Controller类继承ControllerBase类;ControllerBase类只包含最基本的Controller方法,而Controller类包含有支持MVC的方法
异步请求,需要在方法上加上async,并且方法的返回需要是Task类型,并且在return语句中,要加上await,并且调用context的异步方法,如
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems() { // 异步方法ToListAsync(); 同步方法ToList(); return await _context.TodoItems.ToListAsync(); }[ApiController]注解表示,此控制器为Api控制器,所以接收的参数和返回的参数自动包装为json,并且可以拆箱装箱,如
// [FromBody]可省略,因为有ApiController注解了 // 类似的注解还有[FromForm] [FromRoute] [FromQuery] [FromHeader] public async Task<ActionResult<TodoItem>> PostTodoItem([FromBody] TodoItem todoItem){...}[HttpPost] [HttpPut("{id}")] 表示接收的请求方法,并且可接收Resuful参数
在ConfigureServices方法中,加入
services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase("TodoList"));表示,使用内存数据库,数据库名为TodoList。
此项操作将TodoContext注入(DI)到项目。然后即可运行测试
与1.2节有所不同的是,在使用SqlServer数据库中,除了指明数据库,还要指明表
因此,额外加上OnModelCreating方法,意在指明Context适配的表,还要指明主键
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace WebApplication.Models { public class InventoryContext : DbContext { public InventoryContext(DbContextOptions<InventoryContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); EntityTypeBuilder<Inventory> entityTypeBuilder = modelBuilder.Entity<Inventory>(); entityTypeBuilder.ToTable("Inventory"); entityTypeBuilder.HasKey(e => e.Id); } public DbSet<Inventory> Inventories { get; set; } } }步骤同1.3节
在ConfigureServices方法中,加入
services.AddDbContext<InventoryContext>(opt => opt.UseSqlServer( Configuration.GetConnectionString("DefaultConnection") ) );表示,注入的InventoryContext使用SqlServer,并且指定配置
配置文件需要在appsettings.json文件中指明
"ConnectionStrings": { "DefaultConnection": "Data Source=(IP地址)192.168.0.102;Initial Catalog=test(数据库名);Persist Security Info=True;User ID=sa;Password=*****" },然后即可运行测试
此模板仿照Java Web API项目的架构设计,熟悉SpringBoot或SSM的人会感到很熟悉。
这里直接在实体类中声明所属的表和主键等信息,省去了在Context中声明的步骤
等同于将上面两个模板的Controller挪到这里。代码很好懂,包括了同步方法和异步方法
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace WebApplication.Service.ServiceImpl { public class StudentServiceImpl : StudentService { public StudentContext _context; public StudentServiceImpl(StudentContext context) { _context = context; } public bool CreateStudent(Student student) { _context.Students.Add(student); return _context.SaveChanges() > 0; } public bool DeleteStudentByID(int id) { var student = _context.Students.SingleOrDefault(s => s.student_id == id); _context.Students.Remove(student); return _context.SaveChanges() > 0; } public Student GetStudentById(int id) { return _context.Students.SingleOrDefault(s => s.student_id == id); } public async Task<ActionResult<IEnumerable<Student>>> GetStudents() { return await _context.Students.ToListAsync(); } public bool UpdateNameByID(int id, string name) { var state = false; var student = _context.Students.SingleOrDefault(s => s.student_id == id); if (student != null) { student.student_name = name; state = _context.SaveChanges() > 0; } return state; } public bool UpdateStudent(Student student) { _context.Students.Update(student); return _context.SaveChanges() > 0; } } }文件结构同上
using Microsoft.EntityFrameworkCore; namespace WebApplication.DAO { public class StudentContext :DbContext { public StudentContext(DbContextOptions<StudentContext> opt) : base(opt) { } public DbSet<Student> Students { get; set; } } }作为测试,仅调用两个Service方法
using Microsoft.AspNetCore.Mvc; namespace WebApplication.Controllers { [Route("api/[controller]")] [ApiController] public class StudentController : ControllerBase { // 注意这里是StudentService的接口,而不是StudentServiceImpl private readonly StudentService _studentService; public StudentController(StudentService studentService) { _studentService = studentService; } [HttpPost] [Route("add")] public ActionResult<string> Create(Student student) { if (string.IsNullOrEmpty(student.student_name.Trim())) { return "姓名不能为空"; } if (!student.student_gender.Equals("0") && !student.student_gender.Equals("1")) { return "性别数据有误"; } var result = _studentService.CreateStudent(student); if (result) { return "学生插入成功"; } else { return "学生插入失败"; } } //取全部记录 [HttpGet] [HttpPost] [Route("getAll")] public Task<ActionResult<IEnumerable<Student>>> Gets() { return _studentService.GetStudents(); } } }在startup.cs文件中,加入
services.AddDbContext<StudentContext>(opt => opt.UseSqlServer( Configuration.GetConnectionString("DefaultConnection") ) ); services.AddScoped<StudentService, StudentServiceImpl>();然后即可运行测试
1.使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作
2.ASP.NET Core使用EF Core操作MySql数据库
3.使用 Entity Framework Core 实现基础结构持久性层
4.教程:使用 ASP.NET Core 创建 Web API
首次接触ASP .NET Core,如有错误,烦请指正( •̀ ω •́ )✧