手把手教你AspNetCore WebApi:增刪改查
- 2020 年 10 月 6 日
- 筆記
- Asp.Net Core, ef core, entity framework, Web Api
前言
小明已經創建與運行了WebApi項目,了解項目結構有哪些組成,並學會了怎麼發布到IIS。基礎已經建好,從現在開始要真正實現待辦事項的功能了。
新建表
CREATE TABLE [dbo].[Todo](
[Id] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](100) NULL,
CONSTRAINT [PK_Todo] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
添加模型類
- 在「解決方案資源管理器」中,右鍵單擊項目。 選擇「添加」 > 「新建文件夾」。 將文件夾命名為 Models。
- 右鍵單擊 Models 文件夾,然後選擇「添加」 > 「類」 。 將類命名為 Todo,然後選擇「添加」。
using System;
namespace App001.Models
{
public class Todo
{
public Guid Id { get; set; }
public string Name { get; set; }
}
}
添加資料庫上下文
- 右鍵單擊 Models 文件夾,然後選擇「添加」 > 「類」 。 將類命名為 TodoContext,然後單擊「添加」。
using Microsoft.EntityFrameworkCore;
namespace App001.Models
{
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options)
: base(options)
{
}
public DbSet<Todo> Todos { get; set; }
}
}
註冊資料庫上下文
在 ASP.NET Core 中,服務(如資料庫上下文)必須向依賴關係注入 (DI) 容器進行註冊。 該容器向控制器提供服務。
在Startup.cs文件中增加services.AddDbContext,程式碼如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TodoContext>(opt =>opt.UseSqlServer(Configuration.GetConnectionString("TodoContext")));
services.AddControllers();
}
在appsettings.json文件中增加ConnectionStrings,程式碼如下:
"ConnectionStrings": {
"TodoContext": "server=.\\SQLEXPRESS;database=App001;uid=sa;pwd=123456;Pooling='true';Min Pool Size=3;"
},
構建控制器,實現增刪改查
- 右鍵單擊 Controllers 文件夾。
- 選擇「添加」>「新建構建項」 。
- 選擇「其操作使用實體框架的 API 控制器」,然後選擇「添加」 。
- 在「添加其操作使用實體框架的 API 控制器」對話框中:
- 在「模型類」中選擇「Todo (App001.Models)」 。
- 在「數據上下文類」中選擇「TodoContext (App001.Models)」 。
- 選擇「添加」。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using App001.Models;
namespace App001.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class TodosController : ControllerBase
{
private readonly TodoContext context;
public TodosController(TodoContext context)
{
this.context = context;
}
/// <summary>
/// 獲取所有待辦事項
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ActionResult<IEnumerable<Todo>>> GetTodos()
{
return await context.Todo.ToListAsync();
}
/// <summary>
/// 按ID獲取項
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public async Task<ActionResult<Todo>> GetTodo(Guid id)
{
var todo = await context.Todo.FindAsync(id);
if (todo == null)
{
return NotFound();
}
return todo;
}
/// <summary>
/// 添加新項
/// </summary>
/// <param name="todo"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult<Todo>> PostTodo(Todo todo)
{
todo.Id = Guid.NewGuid();
context.Todo.Add(todo);
await context.SaveChangesAsync();
return CreatedAtAction("GetTodo", new { id = todo.Id }, todo);
}
/// <summary>
/// 更新現有項
/// </summary>
/// <param name="id"></param>
/// <param name="todo"></param>
/// <returns></returns>
[HttpPut("{id}")]
public async Task<ActionResult<Todo>> PutTodo(Guid id, Todo todo)
{
var oldTodo = await context.Todo.FindAsync(id);
oldTodo.Name = todo.Name;
context.Entry(oldTodo).State = EntityState.Modified;
await context.SaveChangesAsync();
return oldTodo;
}
/// <summary>
/// 刪除項
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id}")]
public async Task<ActionResult<Todo>> DeleteTodo(Guid id)
{
var todo = await context.Todo.FindAsync(id);
if (todo == null)
{
return NotFound();
}
context.Todo.Remove(todo);
await context.SaveChangesAsync();
return todo;
}
}
}
通過 Postman 測試 添加新項
- 創建新請求。
- 將 HTTP 方法設置為「POST」。
- 將請求 URI 設置為 //localhost:44342/api/todos。
- 選擇「正文」選項卡。
- 選擇「原始」單選按鈕。
- 將類型設置為 JSON (application/json)
- 在請求正文中,輸入待辦事項的 JSON:
{
"Name":"遛狗"
}
- 選擇Send。
小結
目前為止,小明已經實現「待辦事項」的增刪改查,心裡洋洋得意,摸了摸光滑的腦袋,小明美滋滋找小紅去對接了。