怎么使用.NET 6开发TodoList应用引入数据存储

发布时间:2021-12-23 13:32:55 作者:iii
来源:亿速云 阅读:153
# 如何使用.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或更高版本

创建项目

  1. 使用CLI创建WebAPI项目:
dotnet new webapi -n TodoListApi
cd TodoListApi
  1. 添加EF Core工具包:
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.Design
  1. 根据选择的数据库添加对应包:
# SQL Server
dotnet add package Microsoft.EntityFrameworkCore.SqlServer

# SQLite
dotnet add package Microsoft.EntityFrameworkCore.Sqlite

# PostgreSQL
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL

定义模型

TodoItem模型类

// 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 }
        );
    }
}

配置数据库连接

appsettings.json配置

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=TodoList;Trusted_Connection=True;"
  }
}

Program.cs配置

// 添加数据库上下文服务
builder.Services.AddDbContext<TodoContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

应用迁移

  1. 创建初始迁移:
dotnet ef migrations add InitialCreate
  1. 应用迁移到数据库:
dotnet ef database update
  1. 检查迁移文件:
/Migrations/
  20230101000000_InitialCreate.cs
  TodoContextModelSnapshot.cs

创建API控制器

// Controllers/TodoItemsController.cs
[Route("api/[controller]")]
[ApiController]
public class TodoItemsController : ControllerBase
{
    private readonly TodoContext _context;

    public TodoItemsController(TodoContext context)
    {
        _context = context;
    }
    
    // CRUD方法将在下一节实现
}

实现CRUD操作

1. 获取所有Todo项 (GET)

[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
{
    return await _context.TodoItems.ToListAsync();
}

2. 获取单个Todo项 (GET)

[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(int id)
{
    var todoItem = await _context.TodoItems.FindAsync(id);

    if (todoItem == null)
    {
        return NotFound();
    }

    return todoItem;
}

3. 创建Todo项 (POST)

[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);
}

4. 更新Todo项 (PUT)

[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();
}

5. 删除Todo项 (DELETE)

[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);
}

测试API

使用Postman测试

  1. GET 所有项
    GET https://localhost:5001/api/todoitems

  2. GET 单个项
    GET https://localhost:5001/api/todoitems/1

  3. POST 创建项

    {
     "title": "新任务",
     "description": "这是新创建的任务",
     "isCompleted": false
    }
    
  4. PUT 更新项

    {
     "id": 1,
     "title": "更新后的任务",
     "isCompleted": true
    }
    
  5. DELETE 删除项
    DELETE https://localhost:5001/api/todoitems/1

前端集成

添加Swagger支持

// 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

Docker部署

  1. 创建Dockerfile:
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"]
  1. 构建并运行:
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应用并引入数据存储的所有关键步骤。您可以根据需要调整数据库类型、添加更多功能或修改前端实现。

推荐阅读:
  1. vue实现todolist单页面应用
  2. .NET 6开发TodoList应用怎么实现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

todolist

上一篇:ajax中async的作用有什么

下一篇:mysql中出现1053错误怎么办

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》