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 @@ +![步骤](./image/2025-1-3%208-23-7.JPG) + +转换到其他数据库的基本操作流程是类似的,但具体的实现细节会根据目标数据库的不同而有所变化。以下是转换到其他数据库时需要注意的一些通用步骤和可能的差异: +### 通用步骤 + +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