文档
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 零配置,文件存储,毕设答辩演示最方便