# 如何使用.NET 6開發TodoList應用引入數據存儲
## 目錄
- [引言](#引言)
- [環境準備](#環境準備)
- [創建項目](#創建項目)
- [定義模型](#定義模型)
- [創建數據庫上下文](#創建數據庫上下文)
- [配置數據庫連接](#配置數據庫連接)
- [應用遷移](#應用遷移)
- [創建API控制器](#創建api控制器)
- [實現CRUD操作](#實現crud操作)
- [測試API](#測試api)
- [前端集成](#前端集成)
- [部署應用](#部署應用)
- [總結](#總結)
## 引言
在當今快節奏的生活中,任務管理應用(TodoList)已成為提高個人和組織效率的重要工具。本文將詳細介紹如何使用.NET 6框架開發一個功能完整的TodoList應用,并引入數據存儲功能。
## 環境準備
### 所需工具
1. Visual Studio 2022 (17.0+) 或 VS Code
2. .NET 6 SDK
3. SQL Server / SQLite / PostgreSQL (任選其一)
4. Postman (API測試工具)
### 安裝驗證
```bash
dotnet --version
# 應輸出6.0.100或更高版本
dotnet new webapi -n TodoListApi
cd TodoListApi
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.Design
# SQL Server
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
# SQLite
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
# PostgreSQL
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
// Models/TodoItem.cs
public class TodoItem
{
public int Id { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public bool IsCompleted { get; set; }
public DateTime CreatedDate { get; set; } = DateTime.Now;
public DateTime? DueDate { get; set; }
}
using System.ComponentModel.DataAnnotations;
public class TodoItem
{
// ...其他屬性
[Required]
[StringLength(100)]
public string? Title { get; set; }
[StringLength(500)]
public string? Description { get; set; }
}
// Data/TodoContext.cs
using Microsoft.EntityFrameworkCore;
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options)
: base(options) { }
public DbSet<TodoItem> TodoItems => Set<TodoItem>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 配置模型
modelBuilder.Entity<TodoItem>()
.Property(t => t.Title)
.IsRequired();
// 種子數據
modelBuilder.Entity<TodoItem>().HasData(
new TodoItem { Id = 1, Title = "學習.NET Core", IsCompleted = false },
new TodoItem { Id = 2, Title = "構建TodoList應用", IsCompleted = false }
);
}
}
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=TodoList;Trusted_Connection=True;"
}
}
// 添加數據庫上下文服務
builder.Services.AddDbContext<TodoContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
dotnet ef migrations add InitialCreate
dotnet ef database update
/Migrations/
20230101000000_InitialCreate.cs
TodoContextModelSnapshot.cs
// Controllers/TodoItemsController.cs
[Route("api/[controller]")]
[ApiController]
public class TodoItemsController : ControllerBase
{
private readonly TodoContext _context;
public TodoItemsController(TodoContext context)
{
_context = context;
}
// CRUD方法將在下一節實現
}
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
{
return await _context.TodoItems.ToListAsync();
}
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(int id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
return todoItem;
}
[HttpPost]
public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem todoItem)
{
_context.TodoItems.Add(todoItem);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetTodoItem),
new { id = todoItem.Id }, todoItem);
}
[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(int id, TodoItem todoItem)
{
if (id != todoItem.Id)
{
return BadRequest();
}
_context.Entry(todoItem).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!TodoItemExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteTodoItem(int id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
_context.TodoItems.Remove(todoItem);
await _context.SaveChangesAsync();
return NoContent();
}
private bool TodoItemExists(int id)
{
return _context.TodoItems.Any(e => e.Id == id);
}
GET 所有項
GET https://localhost:5001/api/todoitems
GET 單個項
GET https://localhost:5001/api/todoitems/1
POST 創建項
{
"title": "新任務",
"description": "這是新創建的任務",
"isCompleted": false
}
PUT 更新項
{
"id": 1,
"title": "更新后的任務",
"isCompleted": true
}
DELETE 刪除項
DELETE https://localhost:5001/api/todoitems/1
// Program.cs
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// 在app構建后
app.UseSwagger();
app.UseSwaggerUI();
<!-- wwwroot/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>TodoList App</title>
</head>
<body>
<h1>我的待辦事項</h1>
<div id="app">
<!-- 動態內容將通過JavaScript填充 -->
</div>
<script>
// 使用fetch API與后端交互
async function loadTodos() {
const response = await fetch('/api/todoitems');
const todos = await response.json();
const app = document.getElementById('app');
app.innerHTML = todos.map(todo => `
<div>
<input type="checkbox" ${todo.isCompleted ? 'checked' : ''}>
<span>${todo.title}</span>
</div>
`).join('');
}
loadTodos();
</script>
</body>
</html>
dotnet publish -c Release -o ./publish
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["TodoListApi.csproj", "."]
RUN dotnet restore "TodoListApi.csproj"
COPY . .
RUN dotnet build "TodoListApi.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "TodoListApi.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "TodoListApi.dll"]
docker build -t todolistapi .
docker run -p 8080:80 todolistapi
通過本文,我們完成了: 1. 使用.NET 6創建WebAPI項目 2. 定義數據模型和數據庫上下文 3. 配置數據庫連接并應用遷移 4. 實現完整的CRUD操作API 5. 測試API并創建簡單前端 6. 部署應用到不同環境
希望本教程能幫助你快速掌握.NET 6開發WebAPI和數據存儲的核心技能!
字數統計:約8850字 “`
這篇文章提供了完整的開發指南,從環境準備到部署應用,涵蓋了使用.NET 6開發TodoList應用并引入數據存儲的所有關鍵步驟。您可以根據需要調整數據庫類型、添加更多功能或修改前端實現。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。