diff --git "a/\351\273\216\346\254\243\346\254\243/20241230--\346\210\220\347\273\251\350\241\250\347\232\204CRUD.md" "b/\351\273\216\346\254\243\346\254\243/20241230--\346\210\220\347\273\251\350\241\250\347\232\204CRUD.md"
new file mode 100644
index 0000000000000000000000000000000000000000..ab5f0b352735bc2813125340fcb2ae7814f00d0c
--- /dev/null
+++ "b/\351\273\216\346\254\243\346\254\243/20241230--\346\210\220\347\273\251\350\241\250\347\232\204CRUD.md"
@@ -0,0 +1,345 @@
+```cs
+using Microsoft.AspNetCore.Mvc;
+using ScoreManger.Dto;
+using ScoreManger.Models;
+
+namespace ScoreManger.Controllers;
+
+public class ScoresController : Controller
+{
+ private readonly ScoreDbContext _db;
+ public ScoresController()
+ {
+ _db = new ScoreDbContext();
+ }
+ public IActionResult Index()
+ {
+ // 查出所有的成绩记录
+ var scores = _db.Scores.ToList();
+ // 查出所有的学生记录
+ var students = _db.Students.Where(x => !x.IsDeleted).ToList();
+ // 查出所有的课程记录
+ var courses = _db.Courses.ToList();
+
+ // 遍历成绩记录
+ var res = scores.Select(x =>
+ {
+ // 找到和当前成绩记录中的学生Id匹配的学生信息
+ var tmpStudent = students.FirstOrDefault(z => x.StudentId == z.Id);
+ // 找到和当前成绩记录中的课程Id匹配的课程信息
+ var tmpCourse = courses.FirstOrDefault(z => x.CourseId == z.Id);
+
+ // 分别处理学生、课程没有找到的情况
+ var tmpStudentName = tmpStudent == null ? "" : tmpStudent.StudentName;
+ var tmpCourseName = tmpCourse == null ? "" : tmpCourse.CourseName;
+
+ // 返回新的,包含学生姓名和课程名称的信息
+ var res = new
+ {
+ x.Id,
+ x.StudentId,
+ StudentName = tmpStudentName,
+ x.CourseId,
+ CourseName = tmpCourseName,
+ x.Scores
+ };
+ return res;
+ });
+ return View(res);
+ }
+
+ public IActionResult Create()
+ {
+ ViewBag.Courses = _db.Courses.ToList();
+ ViewBag.Students = _db.Students.ToList();
+ return View();
+ }
+ [HttpPost]
+ public IActionResult Create(ScoreCreateDto input)
+ {
+ var obj = new Score
+ {
+ CourseId = input.CourseId,
+ StudentId = input.StuId,
+ Scores = input.Score
+ };
+ _db.Scores.Add(obj);
+ _db.SaveChanges();
+ return RedirectToAction("Index");
+ }
+ public IActionResult Edit(int id)
+ {
+ var obj = _db.Scores.FirstOrDefault(x => x.Id == id);
+ if (obj == null)
+ {
+ return NotFound();
+ }
+ ViewBag.Courses = _db.Courses.ToList();
+ ViewBag.Students = _db.Students.ToList();
+ return View(obj);
+ }
+ [HttpPost]
+ public IActionResult Edit(Score input)
+ {
+ var obj = _db.Scores.FirstOrDefault(x => x.Id == input.Id);
+ if (obj == null)
+ {
+ return NotFound();
+ }
+ obj.CourseId = input.CourseId;
+ obj.StudentId = input.StudentId;
+ obj.Scores = input.Scores;
+ _db.Scores.Update(obj);
+ _db.SaveChanges();
+ return RedirectToAction("Index");
+ }
+ public IActionResult Delete(int id)
+ {
+ var obj = _db.Scores.FirstOrDefault(x => x.Id == id);
+ if (obj == null)
+ {
+ return NotFound();
+ }
+ return View(obj);
+ }
+ public IActionResult DeleteConfirm(int id)
+ {
+ var obj = _db.Scores.FirstOrDefault(x => x.Id == id);
+ if (obj == null)
+ {
+ return NotFound();
+ }
+ _db.Scores.Remove(obj);
+ _db.SaveChanges();
+ return RedirectToAction("Index");
+ }
+}
+
+namespace ScoreManger.Models;
+
+///
+/// 成绩表(成绩实体模型)
+///
+public class Score
+{
+ ///
+ /// 主键Id
+ ///
+ public int Id { get; set; }
+
+ ///
+ /// 学生Id,外键
+ ///
+ public int StudentId { get; set; }
+
+ ///
+ /// 课程Id,外键
+ ///
+ public int CourseId { get; set; }
+
+ ///
+ /// 学生的课程成绩
+ ///
+ public decimal Scores { get; set; }
+}
+```cs
+
+
+# 步骤
+```cs
+
+### 1. 创建数据库和表
+
+首先,在SQL Server中创建一个数据库和成绩表。例如,创建一个名为`School`的数据库和一个名为`Grades`的成绩表:
+
+```sql
+CREATE DATABASE School;
+GO
+
+USE School;
+GO
+
+CREATE TABLE Grades (
+ GradeID INT PRIMARY KEY IDENTITY(1,1),
+ StudentName NVARCHAR(100) NOT NULL,
+ Subject NVARCHAR(50) NOT NULL,
+ Score DECIMAL(5, 2) NOT NULL
+);
+```
+
+### 2. 配置项目以连接SQL Server
+
+在VSCode中打开你的C# MVC项目,并配置连接字符串以连接到SQL Server:
+
+- **修改`appsettings.json`文件**:
+ ```json
+ {
+ "ConnectionStrings": {
+ "SchoolDB": "Server=your-server-address;Database=School;User Id=your-username;Password=your-password;"
+ }
+ }
+ ```
+
+### 3. 使用Entity Framework Core生成模型和上下文
+
+使用Entity Framework Core来生成模型和数据库上下文类。首先,确保你已经安装了EF Core工具和SQL Server提供者:
+
+```bash
+dotnet add package Microsoft.EntityFrameworkCore.SqlServer
+dotnet add package Microsoft.EntityFrameworkCore.Design
+dotnet tool install --global dotnet-ef
+```
+
+然后,使用Scaffold-DbContext命令生成模型和上下文类:
+
+```bash
+dotnet ef dbcontext scaffold "Server=your-server-address;Database=School;User Id=your-username;Password=your-password;" Microsoft.EntityFrameworkCore.SqlServer -o Models
+```
+
+这将在`Models`文件夹中生成对应的模型类和`ApplicationDbContext`类。
+
+### 4. 创建控制器和视图
+
+创建一个控制器来处理成绩表的增删改查操作,并为每个操作创建相应的视图。
+
+- **创建控制器**:
+ 在`Controllers`文件夹中创建一个名为`GradesController.cs`的控制器:
+
+ ```csharp
+ using Microsoft.AspNetCore.Mvc;
+ using Microsoft.EntityFrameworkCore;
+ using YourProjectName.Models;
+ using System.Linq;
+ using System.Threading.Tasks;
+
+ namespace YourProjectName.Controllers
+ {
+ public class GradesController : Controller
+ {
+ private readonly ApplicationDbContext _context;
+
+ public GradesController(ApplicationDbContext context)
+ {
+ _context = context;
+ }
+
+ // GET: Grades
+ public async Task Index()
+ {
+ return View(await _context.Grades.ToListAsync());
+ }
+
+ // GET: Grades/Create
+ public IActionResult Create()
+ {
+ return View();
+ }
+
+ // POST: Grades/Create
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task Create([Bind("GradeID,StudentName,Subject,Score")] Grade grade)
+ {
+ if (ModelState.IsValid)
+ {
+ _context.Add(grade);
+ await _context.SaveChangesAsync();
+ return RedirectToAction(nameof(Index));
+ }
+ return View(grade);
+ }
+
+ // GET: Grades/Edit/5
+ public async Task Edit(int? id)
+ {
+ if (id == null)
+ {
+ return NotFound();
+ }
+
+ var grade = await _context.Grades.FindAsync(id);
+ if (grade == null)
+ {
+ return NotFound();
+ }
+ return View(grade);
+ }
+
+ // POST: Grades/Edit/5
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task Edit(int id, [Bind("GradeID,StudentName,Subject,Score")] Grade grade)
+ {
+ if (id != grade.GradeID)
+ {
+ return NotFound();
+ }
+
+ if (ModelState.IsValid)
+ {
+ try
+ {
+ _context.Update(grade);
+ await _context.SaveChangesAsync();
+ }
+ catch (DbUpdateConcurrencyException)
+ {
+ if (!GradeExists(grade.GradeID))
+ {
+ return NotFound();
+ }
+ else
+ {
+ throw;
+ }
+ }
+ return RedirectToAction(nameof(Index));
+ }
+ return View(grade);
+ }
+
+ // GET: Grades/Delete/5
+ public async Task Delete(int? id)
+ {
+ if (id == null)
+ {
+ return NotFound();
+ }
+
+ var grade = await _context.Grades
+ .FirstOrDefaultAsync(m => m.GradeID == id);
+ if (grade == null)
+ {
+ return NotFound();
+ }
+
+ return View(grade);
+ }
+
+ // POST: Grades/Delete/5
+ [HttpPost, ActionName("Delete")]
+ [ValidateAntiForgeryToken]
+ public async Task DeleteConfirmed(int id)
+ {
+ var grade = await _context.Grades.FindAsync(id);
+ _context.Grades.Remove(grade);
+ await _context.SaveChangesAsync();
+ return RedirectToAction(nameof(Index));
+ }
+
+ private bool GradeExists(int id)
+ {
+ return _context.Grades.Any(e => e.GradeID == id);
+ }
+ }
+ }
+ ```
+
+- **创建视图**:
+ 在`Views/Grades`文件夹中为每个操作创建视图文件(如`Index.cshtml`、`Create.cshtml`、`Edit.cshtml`、`Delete.cshtml`),使用Razor语法来显示和处理表单数据。
+
+### 5. 运行和测试
+
+运行项目并访问相应的URL来测试成绩表的增删改查功能。确保所有操作都能正确执行,并且数据能够正确地保存到SQL Server数据库中.
+
+```
diff --git "a/\351\273\216\346\254\243\346\254\243/20250103--\346\233\264\346\215\242\346\225\260\346\215\256\345\272\223\357\274\214\351\203\250\347\275\262\345\210\260Linux\347\263\273\347\273\237.md" "b/\351\273\216\346\254\243\346\254\243/20250103--\346\233\264\346\215\242\346\225\260\346\215\256\345\272\223\357\274\214\351\203\250\347\275\262\345\210\260Linux\347\263\273\347\273\237.md"
new file mode 100644
index 0000000000000000000000000000000000000000..f4ac25cd716c5715c9658d4fa15091fad57c0d34
--- /dev/null
+++ "b/\351\273\216\346\254\243\346\254\243/20250103--\346\233\264\346\215\242\346\225\260\346\215\256\345\272\223\357\274\214\351\203\250\347\275\262\345\210\260Linux\347\263\273\347\273\237.md"
@@ -0,0 +1,50 @@
+
+
+转换到其他数据库的基本操作流程是类似的,但具体的实现细节会根据目标数据库的不同而有所变化。以下是转换到其他数据库时需要注意的一些通用步骤和可能的差异:
+### 通用步骤
+
+1. **安装相应的EF Core提供者**:
+ 每种数据库都需要一个特定的EF Core提供者。例如:
+ - 对于PostgreSQL,使用Npgsql.EntityFrameworkCore.PostgreSQL:
+ ```bash
+ dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
+ ```
+ - 对于SQLite,使用Microsoft.EntityFrameworkCore.Sqlite:
+ ```bash
+ dotnet add package Microsoft.EntityFrameworkCore.Sqlite
+ ```
+
+2. **修改数据库连接字符串**:
+ 在`appsettings.json`中更新连接字符串以匹配目标数据库的格式和参数。
+
+3. **更新DbContext配置**:
+ 在项目中配置`DbContext`以使用新的数据库提供者。例如,对于PostgreSQL:
+ ```csharp
+ services.AddDbContext(options =>
+ options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")));
+ ```
+
+4. **应用迁移**:
+ 使用EF Core迁移命令来创建和应用数据库迁移:
+ ```bash
+ dotnet ef migrations add InitialCreate
+ dotnet ef database update
+ ```
+
+### 特定数据库的差异
+
+- **SQL语法差异**:不同数据库的SQL语法可能有所不同,尤其是对于一些复杂的查询或特定的数据库功能(如存储过程、触发器等),可能需要调整代码以兼容新的数据库.
+- **数据类型映射**:不同数据库对数据类型的定义和映射可能不同。在迁移数据时,需要确保数据类型之间的兼容性,避免数据丢失或错误.
+- **性能优化**:针对不同数据库的性能优化策略也有所不同。例如,索引的创建、查询优化等可能需要根据目标数据库的特点进行调整.
+- **连接池配置**:数据库连接池的配置参数(如最大连接数、连接超时等)可能需要根据目标数据库的性能和资源情况进行调整.
+
+### 部署到Linux系统的步骤
+
+部署到Linux系统的步骤与之前相同,主要包括:
+
+1. **发布应用**:使用`dotnet publish`命令生成发布文件.
+2. **上传发布文件**:将发布文件上传到Linux服务器.
+3. **配置运行环境**:在Linux服务器上安装.NET Core运行时,并根据需要配置防火墙等.
+4. **运行应用**:在Linux服务器上运行应用,可以使用命令行或`systemd`服务等方式.
+
+
diff --git "a/\351\273\216\346\254\243\346\254\243/image/2025-1-3 8-23-7.JPG" "b/\351\273\216\346\254\243\346\254\243/image/2025-1-3 8-23-7.JPG"
new file mode 100644
index 0000000000000000000000000000000000000000..6742fb4addef311c7328462d8f45688b23a8a22a
Binary files /dev/null and "b/\351\273\216\346\254\243\346\254\243/image/2025-1-3 8-23-7.JPG" differ