Code First CRUD——学生数据库

知识库
知识库文档
/tech-stacks/entity-framework/examples/Code First CRUD——学生数据库.md

文档

Entity Framework Core 入门——学生数据库 CRUD

目标

使用 EF Core + SQLite 构建一个学生管理系统,演示 Code First、迁移、CRUD 全流程。

完整代码

1. 数据模型 Models/Student.cs

namespace StudentDb.Models;

public class Student
{
    public int Id { get; set; }           // 主键,自动递增
    public string Name { get; set; } = "";
    public int Age { get; set; }
    public double Score { get; set; }
    public DateTime EnrollDate { get; set; } = DateTime.Now;
}

public class Course
{
    public int Id { get; set; }
    public string Title { get; set; } = "";
    public int Credits { get; set; }
    public List<Student> Students { get; set; } = new();  // 多对多
}

2. 数据库上下文 Data/AppDbContext.cs

using Microsoft.EntityFrameworkCore;
using StudentDb.Models;

namespace StudentDb.Data;

public class AppDbContext : DbContext
{
    public DbSet<Student> Students => Set<Student>();
    public DbSet<Course> Courses => Set<Course>();

    public AppDbContext(DbContextOptions<AppDbContext> options)
        : base(options) { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 多对多关系配置
        modelBuilder.Entity<Course>()
            .HasMany(c => c.Students)
            .WithMany();
    }
}

3. 主程序 Program.cs

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using StudentDb.Data;
using StudentDb.Models;

var builder = Host.CreateApplicationBuilder(args);

// 注册 SQLite 数据库(文件存储,毕设推荐)
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlite("Data Source=students.db"));

var host = builder.Build();
var scope = host.Services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();

// 自动创建数据库和表(开发环境用,生产用 Migration)
await db.Database.EnsureCreatedAsync();

Console.WriteLine("===== EF Core 学生管理系统 =====");

// ==== CREATE ====
Console.WriteLine("\n--- 添加学生 ---");
db.Students.AddRange(
    new Student { Name = "张三", Age = 22, Score = 88.5 },
    new Student { Name = "李四", Age = 21, Score = 92.0 },
    new Student { Name = "王五", Age = 23, Score = 76.5 }
);
await db.SaveChangesAsync();
Console.WriteLine("已添加 3 名学生");

// ==== READ ====
Console.WriteLine("\n--- 查询所有学生 ---");
var allStudents = await db.Students.ToListAsync();
foreach (var s in allStudents)
    Console.WriteLine($"  ID:{s.Id} {s.Name}, {s.Age}岁, {s.Score}分");

// LINQ 条件查询
Console.WriteLine("\n--- 成绩 >= 90 的学生 ---");
var topStudents = await db.Students
    .Where(s => s.Score >= 90)
    .OrderByDescending(s => s.Score)
    .ToListAsync();
foreach (var s in topStudents)
    Console.WriteLine($"  {s.Name}: {s.Score}分");

// ==== UPDATE ====
Console.WriteLine("\n--- 更新张三成绩 ---");
var zhangsan = await db.Students.FirstAsync(s => s.Name == "张三");
zhangsan.Score = 95.0;
await db.SaveChangesAsync();
Console.WriteLine($"张三新成绩: {zhangsan.Score}分");

// ==== DELETE ====
Console.WriteLine("\n--- 删除成绩低于 80 的学生 ---");
var lowStudents = await db.Students.Where(s => s.Score < 80).ToListAsync();
db.Students.RemoveRange(lowStudents);
var deleted = await db.SaveChangesAsync();
Console.WriteLine($"已删除 {deleted} 条记录");

// ==== 最终结果 ====
Console.WriteLine("\n--- 最终学生列表 ---");
foreach (var s in await db.Students.ToListAsync())
    Console.WriteLine($"  {s.Name}: {s.Score}分");

Console.WriteLine("\n按任意键退出...");
Console.ReadKey();

4. 项目文件 StudentDb.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.*" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.*" />
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.*" />
  </ItemGroup>
</Project>

运行步骤

dotnet new console -n StudentDb
cd StudentDb
# 添加 NuGet 包
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.Extensions.Hosting
# 替换代码后运行
dotnet run

预期输出

===== EF Core 学生管理系统 =====

--- 添加学生 ---
已添加 3 名学生

--- 查询所有学生 ---
  ID:1 张三, 22岁, 88.5分
  ID:2 李四, 21岁, 92分
  ID:3 王五, 23岁, 76.5分

--- 成绩 >= 90 的学生 ---
  李四: 92分

--- 更新张三成绩 ---
张三新成绩: 95分

--- 删除成绩低于 80 的学生 ---
已删除 1 条记录

--- 最终学生列表 ---
  张三: 95分
  李四: 92

关键点

  • DbContext 是数据库会话,管理实体操作
  • DbSet<T> 对应数据库表,可直接 LINQ 查询
  • SaveChangesAsync() 将内存变更批量写入数据库
  • EnsureCreated 适合毕设快速原型;正式项目用 Migration
  • SQLite 零配置,文件存储,毕设答辩演示最方便

信息

路径
/tech-stacks/entity-framework/examples/Code First CRUD——学生数据库.md
更新时间
2026/5/30