diff --git "a/\350\260\255\345\215\223\346\226\207/20260119-\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\344\270\212\344\270\213\346\226\207.md" "b/\350\260\255\345\215\223\346\226\207/20260119-\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\344\270\212\344\270\213\346\226\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..56aa920e8860e7970a8e3a5f962bc6131aedde28 --- /dev/null +++ "b/\350\260\255\345\215\223\346\226\207/20260119-\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\344\270\212\344\270\213\346\226\207.md" @@ -0,0 +1,55 @@ +# **第五章:数据库连接与上下文(EF Core)** + +## **学习目标** +- 理解 EF Core 的基本原理 +- 配置 DbContext 与 SQLite 连接 +- 使用 Code First 和迁移创建数据库 +- 实现基本的 CRUD 操作 + +## **核心任务** +用 EF Core 的 Code First 方式,配置 SQLite 连接,通过迁移生成 Student 表,实现数据持久化。 + +--- + +## **1. 任务背景** +第四章的学生数据仅存于内存,重启即丢失。现在需将其持久化到数据库。 + +**目标**: +1. 连接真实数据库(选用 SQLite) +2. 将 Student 模型映射为数据表 +3. 支持增删改查(CRUD) + +**为何选 SQLite?** +- 轻量、无需服务器 +- 单文件存储,便于教学和部署 +- 完全兼容 EF Core + +--- + +## **2. 核心知识** + +### **2.1 EF Core 简介** +EF Core 是微软的 ORM(对象关系映射)框架,自动将 C# 对象转换为数据库操作: + +- 类 → 表 +- 对象 → 行 +- 属性 → 列 +- 自动生成 SQL + +> **比喻**:EF Core 是“翻译官”,把 C# 操作转成数据库能执行的 SQL。 + +![EF Core 工作原理](https://gitee.com/myhfw003/aspnetcore-mvc-course-grade24/raw/master/assets/images/efcore-arch.svg) + +### **2.2 开发模式** +- **Code First(本章采用)**:先写模型,再生成数据库 +- Database First:从现有数据库生成代码 +- Model First:通过可视化模型生成代码和库(EF6 支持,EF Core 不推荐) + +### **2.3 核心组件** + +| 组件 | 作用 | +|----------------|--------------------------| +| **DbContext** | 数据库会话入口 | +| **DbSet** | 对应一张数据库表 | +| **Migration** | 同步模型变更到数据库 | +| **ModelBuilder** | 自定义映射规则 | \ No newline at end of file diff --git "a/\350\260\255\345\215\223\346\226\207/20260121-\351\205\215\347\275\256\350\277\236\346\216\245.md" "b/\350\260\255\345\215\223\346\226\207/20260121-\351\205\215\347\275\256\350\277\236\346\216\245.md" new file mode 100644 index 0000000000000000000000000000000000000000..d5666eb5fe0d2d9bb6808c38c329b1df7e98703a --- /dev/null +++ "b/\350\260\255\345\215\223\346\226\207/20260121-\351\205\215\347\275\256\350\277\236\346\216\245.md" @@ -0,0 +1,19 @@ +### **知识点2:配置 DbContext 与 SQLite 连接** + +#### **2.1 DbContext 是什么?** +`DbContext` 是 EF Core 的核心,用于: +- 管理数据库连接 +- 跟踪实体变更 +- 执行 CRUD 操作 +- 处理事务 + +#### **2.2 配置步骤** +1. 创建继承 `DbContext` 的类 +2. 添加 `DbSet` 等属性表示数据表 +3. 在构造函数或 `OnConfiguring` 中指定 SQLite 连接字符串 +4. 在 `Program.cs` 中通过依赖注入注册该上下文 + +#### **2.3 为什么用 SQLite?** +- 嵌入式、零配置 +- 数据存于单个文件(如 `students.db`) +- 无需独立数据库服务,适合开发和小型应用 \ No newline at end of file diff --git "a/\350\260\255\345\215\223\346\226\207/20260122-\350\277\201\347\247\273\346\225\260\346\215\256\345\272\223.md" "b/\350\260\255\345\215\223\346\226\207/20260122-\350\277\201\347\247\273\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 0000000000000000000000000000000000000000..2aeb1af19502e8f83da729fab8757ea9f8b50215 --- /dev/null +++ "b/\350\260\255\345\215\223\346\226\207/20260122-\350\277\201\347\247\273\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,33 @@ +### **知识点3:迁移(Migration)** + +#### **3.1 什么是迁移?** +迁移是 EF Core 将代码模型变更同步到数据库的机制,用于: +- 记录模型变更历史 +- 自动生成更新数据库结构的 SQL 脚本 +- 支持版本控制与回滚 + +#### **3.2 工作流程** +``` +修改模型 → 创建迁移 → 应用迁移 → 数据库更新 +``` + +#### **3.3 常用命令** +```bash +# 安装 EF Core CLI 工具(如未安装) +dotnet tool install --global dotnet-ef + +# 创建新迁移 +dotnet ef migrations add <名称> # 如:InitialCreate + +# 应用所有迁移至数据库 +dotnet ef database update + +# 撤销最近一次迁移(未应用时) +dotnet ef migrations remove + +# 生成完整 SQL 脚本(不执行) +dotnet ef migrations script + +# 回滚或更新到指定迁移 +dotnet ef database update <迁移名> +``` \ No newline at end of file diff --git "a/\350\260\255\345\215\223\346\226\207/20260123-\346\225\260\346\215\256\346\223\215\344\275\234.md" "b/\350\260\255\345\215\223\346\226\207/20260123-\346\225\260\346\215\256\346\223\215\344\275\234.md" new file mode 100644 index 0000000000000000000000000000000000000000..84a3db6181be6646240770fee90c1a53c86063e8 --- /dev/null +++ "b/\350\260\255\345\215\223\346\226\207/20260123-\346\225\260\346\215\256\346\223\215\344\275\234.md" @@ -0,0 +1,94 @@ + + +# **知识点4:使用DbContext操作数据库** + +## **4.1 基本操作** + +```csharp +// 新增 +var 新生 = new 学生 { 姓名 = "张三", 年龄 = 20 }; +上下文.学生表.Add(新生); +await 上下文.SaveChangesAsync(); + +// 查询 +var 学生 = await 上下文.学生表.FindAsync(1); // 按ID查 +var 高龄生 = await 上下文.学生表.Where(s => s.年龄 > 18).ToListAsync(); + +// 更新 +学生.姓名 = "李四"; +上下文.学生表.Update(学生); +await 上下文.SaveChangesAsync(); + +// 删除 +上下文.学生表.Remove(学生); +await 上下文.SaveChangesAsync(); +``` + +## **4.2 实体状态** + +- 未跟踪:Detached +- 已添加:Added +- 未修改:Unchanged +- 已修改:Modified +- 已删除:Deleted + +## **4.3 查询优化** + +```csharp +// 简单查询 +var 所有学生 = 上下文.学生表.ToList(); + +// 筛选排序 +var 结果 = 上下文.学生表 + .Where(s => s.年龄 > 18) + .OrderBy(s => s.姓名) + .Skip(10).Take(10) + .ToList(); + +// 只取必要字段 +var 名单 = 上下文.学生表 + .Select(s => new { s.学号, s.姓名 }) + .ToList(); +``` + +--- + +## **3. 实施步骤** + +### **1. 安装依赖包** + +```bash +dotnet add package Microsoft.EntityFrameworkCore.Sqlite +dotnet add package Microsoft.EntityFrameworkCore.Design +dotnet add package Microsoft.EntityFrameworkCore.Tools +``` + +### **2. 创建数据库上下文** + +在Models文件夹中创建`应用程序上下文.cs`: + +```csharp +using Microsoft.EntityFrameworkCore; +using 学生管理系统.Models; + +namespace 学生管理系统.Data +{ + public class 应用程序上下文 : DbContext + { + public 应用程序上下文(DbContextOptions<应用程序上下文> 选项) : base(选项) { } + + public DbSet<学生> 学生表 { get; set; } + + protected override void OnModelCreating(ModelBuilder 模型) + { + 模型.Entity<学生>(实体 => + { + 实体.HasKey(s => s.学号); + 实体.HasIndex(s => s.邮箱).IsUnique(); + 实体.Property(s => s.姓名).IsRequired(); + // 其他属性配置简化 + }); + } + } +} +``` \ No newline at end of file