From 7b86fafaabe5358d7624f42bdbf7c152ddab3d97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E7=8E=89=E7=8E=BA?= <2879853118@qq.com> Date: Mon, 16 Dec 2024 12:23:30 +0800 Subject: [PATCH 1/2] ggg --- ...72\345\272\223\345\273\272\350\241\250.md" | 261 ++++++++++++++++++ ...\222\214lambda\350\257\255\345\217\245.md" | 157 +++++++++++ 2 files changed, 418 insertions(+) create mode 100644 "\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/EF\345\217\215\345\220\221\347\273\231sqlserver\345\273\272\345\272\223\345\273\272\350\241\250.md" create mode 100644 "\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/linq\345\222\214lambda\350\257\255\345\217\245.md" diff --git "a/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/EF\345\217\215\345\220\221\347\273\231sqlserver\345\273\272\345\272\223\345\273\272\350\241\250.md" "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/EF\345\217\215\345\220\221\347\273\231sqlserver\345\273\272\345\272\223\345\273\272\350\241\250.md" new file mode 100644 index 0000000..4d4c9f8 --- /dev/null +++ "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/EF\345\217\215\345\220\221\347\273\231sqlserver\345\273\272\345\272\223\345\273\272\350\241\250.md" @@ -0,0 +1,261 @@ +# 使用 Entity Framework Core 连接 SQL Server 数据库 + +## 1. 引入必要的命名空间 +在使用 Entity Framework Core 之前,确保在项目中引入以下命名空间: + +```csharp +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Mvc; +``` + +## 2. 创建数据库模型类 + +定义一个模型类,表示数据库中的一张表。以博客为例: + +### 示例代码 + +```csharp +public class Blog +{ + public int Id { get; set; } // 主键 + public string Title { get; set; } // 博客标题 + public string Content { get; set; } // 博客内容 + public DateTime CreatedAt { get; set; } // 创建时间 +} +``` + +### 说明 + +- `Id`:主键,通常是自增的。 +- `Title` 和 `Content`:存储博客的标题和内容。 +- `CreatedAt`:记录博客创建的时间。 + +## 3. 创建数据库上下文类 + +数据库上下文类用于与数据库进行交互,通常继承自 `DbContext`。在该类中,我们可以定义与数据库表对应的 `DbSet` 属性,代表数据库中的一张表。`DbContext` 负责管理实体的生命周期、数据库连接以及事务。 + +### 示例代码 + +```csharp +public class BlogDbContext : DbContext +{ + // DbSet 表示数据库中的 Blogs 表 + public DbSet Blogs { get; set; } + + // 构造函数,传入 DbContextOptions 来配置数据库连接 + public BlogDbContext(DbContextOptions options) : base(options) + { + } + + // 重写 OnConfiguring 方法来配置数据库连接字符串 + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + if (!optionsBuilder.IsConfigured) + { + // 这里配置 SQL Server 数据库连接字符串 + optionsBuilder.UseSqlServer("Server=;Database=;User Id=;Password=;TrustServerCertificate=true"); + } + } +} +``` + +### 说明 + +- **DbSet**:表示数据库中的 `Blogs` 表。每个 `DbSet` 对象对应一个数据库表,并且允许我们执行各种数据库操作(如查询、插入、更新、删除)。 +- **构造函数**:该构造函数接受一个 `DbContextOptions` 对象,这个对象通常在启动时由依赖注入(DI)框架提供。如果你是手动创建 `DbContext` 实例,可以在构造函数中配置数据库连接。 +- **OnConfiguring 方法**:`DbContext` 类通过 `OnConfiguring` 方法来配置数据库的连接字符串。这里使用 `UseSqlServer` 方法配置连接到 SQL Server 的信息。如果没有通过依赖注入提供配置,`OnConfiguring` 会手动配置。 + +### 连接字符串格式 + +在 `OnConfiguring` 方法中,连接字符串通过 `UseSqlServer` 方法配置。连接字符串通常包括以下信息: + +```plaintext +Server=;Database=;User Id=;Password=;TrustServerCertificate=true +``` + +- **Server**:数据库服务器地址(例如 `localhost` 或 `127.0.0.1`)。 +- **Database**:数据库的名称。 +- **User Id 和 Password**:用于连接数据库的用户名和密码。 +- **TrustServerCertificate**:用于跳过 SSL 验证,在某些环境下可能需要设置为 `true`。 + +### 提示: + +- 在实际应用中,建议不要在代码中硬编码连接字符串。可以将其存储在 `appsettings.json` 或通过环境变量来配置,尤其是在生产环境中。 + +## 4. 配置数据库连接 + +在 `OnConfiguring` 方法中,我们配置了数据库连接。通过 `DbContextOptionsBuilder` 配置连接字符串,并将其传递给 `DbContext`。如果使用依赖注入的方式,可以在 `Startup.cs` 中配置数据库连接。 + +### 示例代码(敏感信息已屏蔽) + +```csharp +protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) +{ + optionsBuilder.UseSqlServer("Server=;Database=;User Id=;Password=;TrustServerCertificate=true"); +} +``` + +### 说明: + +- 如果你的应用程序中有多个数据库连接,或者需要更复杂的配置,可以通过 `DbContextOptions` 传递不同的配置。在这种情况下,建议使用依赖注入而不是手动配置。 + +## 5. 创建控制器 + +控制器用于处理请求并与数据库上下文交互。以下是一个简单的控制器示例,直接实例化 `BlogDbContext`。 + +### 示例代码 + +```csharp +public class HomeController : Controller +{ + private readonly BlogDbContext _context; + + // 控制器构造函数,手动实例化 DbContext + public HomeController() + { + var optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseSqlServer("Server=;Database=;User Id=;Password=;TrustServerCertificate=true"); + + _context = new BlogDbContext(optionsBuilder.Options); // 直接实例化 DbContext + } + + // 主页示例 + [HttpGet] + public IActionResult Index() + { + var blogList = _context.Blogs.ToList(); // 获取所有博客条目 + return View(blogList); // 返回视图 + } + + [HttpPost] + public IActionResult Index(string searchQuery) + { + if (string.IsNullOrEmpty(searchQuery)) + { + var blogList = _context.Blogs.ToList(); // 如果搜索查询为空,返回所有博客 + return View(blogList); + } + + searchQuery = searchQuery.Trim(); + var filteredList = _context.Blogs + .Where(x => x.Title.Contains(searchQuery)) // 根据标题过滤博客 + .ToList(); + return View(filteredList); // 返回过滤后的结果 + } +} +``` + +### 说明 + +- 控制器通过构造函数直接实例化 `_context`,以便与数据库交互。这里展示了手动创建 `DbContext` 的方法,但在实际应用中,推荐使用依赖注入(DI)来创建 `DbContext` 实例。 +- `Index` 方法处理 GET 和 POST 请求。当 `searchQuery` 为空时,返回所有博客条目;否则,返回包含搜索查询的博客条目。 + +## 6. 处理数据库迁移 + +在使用 Entity Framework Core 时,需要进行数据库迁移以创建或更新数据库结构。迁移可以帮助你将模型类和数据库结构同步,避免手动修改数据库表结构。 + +### 6.1 安装 EF Core 工具 + +在开始迁移之前,首先需要安装 `dotnet-ef` 工具。这个工具可以让你在命令行中执行与数据库迁移相关的操作。 + +```bash +dotnet tool install --global dotnet-ef +``` + +- **功能**:安装 EF Core 的命令行工具。 +- **作用**:安装完毕后,你可以在命令行中使用 `dotnet ef` 命令来进行数据库迁移操作。 + +### 6.2 添加必要的 NuGet 包 + +在项目中使用迁移功能之前,需要安装 `Microsoft.EntityFrameworkCore.Design` 包。这个包包含了 EF Core 迁移所需的一些设计时功能。 + +```bash +dotnet add package Microsoft.EntityFrameworkCore.Design +``` + +- **功能**:提供了生成和应用迁移所需的功能。 +- **作用**:确保项目中有此包,才能顺利执行迁移命令。 + +### 6.3 创建迁移文件 + +每当你更改了数据模型(例如添加、删除或修改字段),都需要生成一个迁移文件。这个文件记录了模型和数据库结构之间的差异,并告诉 EF Core 如何更新数据库。 + +```bash +dotnet ef migrations add [迁移名称] +``` + +- **命令**:`dotnet ef migrations add [迁移名称]` +- **必填项**:`[迁移名称]` 是你指定的迁移的名称。通常,迁移名称用于描述此次迁移的内容,比如 `InitialCreate`、`AddCreatedAtColumn` 等。 +- **功能**:生成一个迁移文件,记录数据库模型的变化。 +- **作用**:例如,`InitialCreate` 是迁移的名称,EF Core 会检查数据库上下文中的模型,并生成对应的 SQL 语句以更新数据库表结构。 + +例如,如果你第一次创建数据库,可以使用 `InitialCreate` 作为迁移名称: + +```bash +dotnet ef migrations add InitialCreate +``` + +### 6.4 更新数据库 + +创建了迁移文件后,下一步是将迁移应用到数据库中,更新数据库的结构。这个操作会根据迁移文件中记录的内容,执行数据库表结构的更新。 + +```bash +dotnet ef database update +``` + +- **功能**:将迁移应用到数据库中,更新数据库结构。 +- **作用**:执行该命令后,数据库中的表结构将根据迁移文件中的指令更新。如果有多个迁移,它会按顺序应用所有迁移,直到最新的迁移。 + +### 6.5 示例工作流 + +假设你有一个 `Blog` 类,并且创建了 `BlogDbContext`,步骤如下: + +1. **安装 EF Core 工具**: + + ```bash + dotnet tool install --global dotnet-ef + ``` + +2. **添加 EF Core Design 包**: + + ```bash + dotnet add package Microsoft.EntityFrameworkCore.Design + ``` + +3. **生成迁移文件**: + + 假设你要创建一个名为 `InitialCreate` 的迁移文件,可以使用以下命令: + + ```bash + dotnet ef migrations add InitialCreate + ``` + + - **注意**:`InitialCreate` 是迁移的名称,你可以根据实际情况更改名称。如果后续添加字段或修改模型,应该使用不同的迁移名称。 + +4. **更新数据库**: + + ```bash + dotnet ef database update + ``` + +### 6.6 总结 + +处理数据库迁移的步骤如下: + +1. 安装 EF Core 工具: + + - 使用 `dotnet tool install --global dotnet-ef` 安装 EF Core 命令行工具。 + +2. 添加必需的包: + + - 使用 `dotnet add package Microsoft.EntityFrameworkCore.Design` 添加迁移所需的设计时包。 + +3. 创建迁移文件: + + - 使用 `dotnet ef migrations add [迁移名称]` 创建迁移文件,记录数据库模型的变化。记得将 `[迁移名称]` 替换为适当的名称,例如 `InitialCreate`。 + +4. 更新数据库: + + - 使用 `dotnet ef database update` 将迁移应用到数据库,更新数据库结构。 \ No newline at end of file diff --git "a/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/linq\345\222\214lambda\350\257\255\345\217\245.md" "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/linq\345\222\214lambda\350\257\255\345\217\245.md" new file mode 100644 index 0000000..33e4300 --- /dev/null +++ "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/linq\345\222\214lambda\350\257\255\345\217\245.md" @@ -0,0 +1,157 @@ +# LINQ 集成查询语句 + +## 1. Where: 条件查询 +用于筛选符合条件的元素。 + +```csharp +var query = nums.Where(n => n >= 2 && n <= 8); +``` + +示例:筛选出 `nums` 中大于等于 2 且小于等于 8 的数字。 + +--- + +## 2. Select: 基本查询 +用于选择集合中的元素,可以选择整个元素或其特定属性。 + +```csharp +var query = nums.Select(n => n); +``` + +示例:从 `nums` 中选择所有元素。 + +--- + +## 3. OrderBy: 升序排序 +将集合按照指定的键进行升序排列。 + +```csharp +var ages = nums.Where(s => s.Age > 20).OrderBy(s => s.Age); +``` + +示例:筛选出 `nums` 中年龄大于 20 的对象,并按照年龄升序排序。 + +--- + +## 4. OrderByDescending: 降序排序 +将集合按照指定的键进行降序排列。 + +```csharp +var ages = nums.Where(s => s.Age > 20).OrderByDescending(s => s.Age); +``` + +示例:筛选出 `nums` 中年龄大于 20 的对象,并按照年龄降序排序。 + +--- + +## 5. Select: 投影 +投影用于选择集合中的特定属性或对元素进行计算后返回。 + +```csharp +var query = nums.Select(n => n * 2); +``` + +示例:将 `nums` 中的每个元素乘以 2。 + +--- + +## 6. Any: 是否存在 +检查集合中是否存在符合条件的元素。 + +```csharp +bool exists = nums.Any(n => n > 10); +``` + +示例:判断 `nums` 中是否存在大于 10 的元素。 + +**提示**:`All` 方法用于判断集合中的所有元素是否满足条件。 + +--- + +## 7. FirstOrDefault: 查找第一个元素 +返回符合条件的第一个元素。如果没有找到,则返回默认值(如 `null` 或类型的默认值)。 + +```csharp +var first = nums.FirstOrDefault(n => n > 3); +``` + +示例:找出 `nums` 中第一个大于 3 的元素。 + +--- + +## 8. Last: 查找最后一个元素 +返回符合条件的最后一个元素。 + +```csharp +var last = nums.Where(n => n < 7).Last(); +``` + +示例:找出 `nums` 中最后一个小于 7 的元素。 + +--- + +## 9. Distinct: 去重 +去除集合中的重复元素。 + +```csharp +var distinctNums = nums.Distinct(); +``` + +示例:获取 `nums` 中去重后的元素集合。 + +--- + +## 10. StartsWith: 筛选字符串开头的 +筛选集合中以指定字符串开头的元素。 + +```csharp +var wangStu = students.Where(name => name.Name.StartsWith("王")); +``` + +示例:筛选出 `students` 中名字以 "王" 开头的学生。 + +--- + +## 11. Contains: 筛选包含某个字符串的 +筛选集合中包含指定字符串的元素。 + +```csharp +var wangStu = students.Where(name => name.Name.Contains("王")); +``` + +示例:筛选出 `students` 中名字包含 "王" 的学生。 + +--- + +## 聚合查询 +LINQ 支持多种聚合操作,如 `Sum`、`Average`、`Count` 等。以下是常见聚合方法: + +### 1. Sum: 计算总和 +```csharp +var total = nums.Sum(); +``` +示例:计算 `nums` 中所有元素的总和。 + +### 2. Average: 计算平均值 +```csharp +var avg = nums.Average(); +``` +示例:计算 `nums` 中所有元素的平均值。 + +### 3. Count: 计算数量 +```csharp +var count = nums.Count(n => n > 5); +``` +示例:计算 `nums` 中大于 5 的元素个数。 + +### 4. Max: 找出最大值 +```csharp +var max = nums.Max(); +``` +示例:找出 `nums` 中的最大值。 + +### 5. Min: 找出最小值 +```csharp +var min = nums.Min(); +``` +示例:找出 `nums` 中的最小值。 -- Gitee From ce35a0d3eb1c5091a579c1fed30a4afd380ba007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E7=8E=89=E7=8E=BA?= <2879853118@qq.com> Date: Sun, 22 Dec 2024 21:10:24 +0800 Subject: [PATCH 2/2] ggg --- ...45\345\216\273\351\207\215\345\244\215.md" | 63 ++++++ ...56\346\225\260\346\215\256\345\272\223.md" | 204 ++++++++++++++++++ ...45\346\225\260\346\215\256\345\272\223.md" | 120 +++++++++++ ...26\350\276\221\347\275\221\351\241\265.md" | 166 ++++++++++++++ 4 files changed, 553 insertions(+) create mode 100644 "\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/Linq\346\237\245\350\257\242\350\257\255\345\217\245\345\216\273\351\207\215\345\244\215.md" create mode 100644 "\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/mvc\350\256\277\351\227\256\346\225\260\346\215\256\345\272\223.md" create mode 100644 "\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/\344\275\277\347\224\250EF\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" create mode 100644 "\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/\347\274\226\350\276\221\347\275\221\351\241\265.md" diff --git "a/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/Linq\346\237\245\350\257\242\350\257\255\345\217\245\345\216\273\351\207\215\345\244\215.md" "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/Linq\346\237\245\350\257\242\350\257\255\345\217\245\345\216\273\351\207\215\345\244\215.md" new file mode 100644 index 0000000..49325d4 --- /dev/null +++ "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/Linq\346\237\245\350\257\242\350\257\255\345\217\245\345\216\273\351\207\215\345\244\215.md" @@ -0,0 +1,63 @@ +# LINQ 查询数组并去重 + +### 代码示例 + +```csharp +public ActionResult Index_6() +{ + int[] numbers = { 1, 2, 3, 4, 5, 6, 18, 23, 64, 7, 18, 2, 3 }; + var uniqueNumbers = numbers + .GroupBy(n => n) // 按值分组 + .Where(g => g.Count() == 1) // 筛选只出现一次的数字 + .Select(g => g.Key); // 获取这些数字 + return View(uniqueNumbers); +} +``` + +------ + +### 知识点总结 + +1. **GroupBy** + - 将集合中的元素按照某种规则分组。 + - 本例中:`GroupBy(n => n)` 按数字值分组。 +2. **Where** + - 筛选出满足条件的元素。 + - 本例中:`Where(g => g.Count() == 1)` 筛选出只出现一次的数字。 +3. **Select** + - 用于投影数据,返回需要的结果。 + - 本例中:`Select(g => g.Key)` 返回每组的键(数字值)。 + +------ + +### 输出结果说明 + +假设输入数组为 `{ 1, 2, 3, 4, 5, 6, 18, 23, 64, 7, 18, 2, 3 }`: + +- 按值分组:`{1}, {2, 2}, {3, 3}, {4}, {5}, {6}, {18, 18}, {23}, {64}, {7}` +- 筛选只出现一次的组:`{1}, {4}, {5}, {6}, {23}, {64}, {7}` +- 最终结果:`1, 4, 5, 6, 23, 64, 7` + +------ + +### 延伸知识 + +- **Distinct()** + 如果只是简单去除重复值,`Distinct()` 更加直观: + + ```csharp + int[] numbers = { 1, 2, 2, 3 }; + var distinctNumbers = numbers.Distinct(); // 结果:1, 2, 3 + ``` + +- **DistinctBy (.NET 6 及以上)** + 根据对象的属性去重: + + ```csharp + var people = new[] { + new { Name = "Alice", Age = 25 }, + new { Name = "Bob", Age = 30 }, + new { Name = "Alice", Age = 25 } + }; + var distinctByName = people.DistinctBy(p => p.Name); + ``` \ No newline at end of file diff --git "a/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/mvc\350\256\277\351\227\256\346\225\260\346\215\256\345\272\223.md" "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/mvc\350\256\277\351\227\256\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 0000000..4424824 --- /dev/null +++ "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/mvc\350\256\277\351\227\256\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,204 @@ +# 使用控制器访问数据库 + +### 1. 创建控制器 + +在 ASP.NET Core 中,控制器是处理用户请求并返回响应的核心组件。为了访问数据库,需要在控制器中通过 `DbContext` 进行操作。 + +**代码示例:** + +```csharp +using Microsoft.AspNetCore.Mvc; + +namespace BookManage.Models; + +public class BookManageController : Controller +{ + private readonly ILogger _logger; + + // 通过构造函数注入日志服务 + public BookManageController(ILogger logger) + { + _logger = logger; + } + + // 引用数据库上下文 + protected internal BookDbContext db = new BookDbContext(); + + // 处理根路径的请求并返回所有书籍信息 + public IActionResult Index() + { + var books = db.books.ToList(); // 获取数据库中的所有书籍 + return View(books); + } + + // 隐私页面(示例) + public IActionResult Privacy() + { + return View(); + } +} +``` + +------ + +### 2. 核心知识点 + +1. **数据库上下文引用** + + ```csharp + protected internal BookDbContext db = new BookDbContext(); + ``` + + - `protected internal`: 确保 `db` 既能被当前类访问,也能在派生类中访问。 + - `BookDbContext`: 数据库上下文类,用于操作数据库。 + +2. **Index 方法** + + - 通过 + + ``` + DbContext + ``` + + 的 + + ``` + books + ``` + + 属性获取数据库中的所有书籍数据: + + ```csharp + var books = db.books.ToList(); + ``` + + - 调用 `ToList()` 方法将数据查询为实体列表并返回给视图。 + +3. **日志注入** + + - 通过 + + ``` + ILogger + ``` + + 记录日志,方便调试和跟踪: + + ```csharp + private readonly ILogger _logger; + ``` + +------ + +### 3. 注意事项 + +1. **数据库上下文的生命周期** + + - 直接在控制器中创建 + + ``` + DbContext + ``` + + 是一种简单实现方式,但在更复杂的项目中,推荐通过 + + 依赖注入 (DI) + + 管理 + + ``` + DbContext + ``` + + 的生命周期: + + ```csharp + public class BookManageController : Controller + { + private readonly BookDbContext _dbContext; + + public BookManageController(BookDbContext dbContext) + { + _dbContext = dbContext; + } + } + ``` + + - 配置 DI 需要在 + + ``` + Program.cs + ``` + + 或 + + ``` + Startup.cs + ``` + + 中添加服务: + + ```csharp + services.AddDbContext(options => + options.UseSqlServer("YourConnectionString")); + ``` + +2. **性能问题** + + - 如果数据量较大,避免直接使用 + + ``` + ToList() + ``` + + 加载所有数据,建议分页加载,使用 + + ``` + Skip + ``` + + 和 + + ``` + Take + ``` + + 方法: + + ```csharp + var books = db.books.Skip(0).Take(10).ToList(); // 加载前 10 条数据 + ``` + +3. **资源释放** + + - 如果没有使用依赖注入,确保 + + ``` + DbContext + ``` + + 在适当时候释放,避免资源占用。例如: + + ```csharp + protected internal BookDbContext db = new BookDbContext(); + + public IActionResult Index() + { + using (db) + { + var books = db.books.ToList(); + return View(books); + } + } + ``` + +------ + +### 4. 整体工作流程 + +1. **用户请求** + 用户访问控制器的 `Index` 方法,例如 `https://localhost:5001/BookManage`。 +2. **控制器处理** + 控制器通过 `DbContext` 查询数据库中所有书籍数据。 +3. **返回视图** + 查询到的数据通过 `View(books)` 返回到视图进行展示。 \ No newline at end of file diff --git "a/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/\344\275\277\347\224\250EF\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/\344\275\277\347\224\250EF\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 0000000..81e9ec6 --- /dev/null +++ "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/\344\275\277\347\224\250EF\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,120 @@ +# 使用 Entity Framework Core 实现数据库操作 + +### 1. 创建数据库上下文类 + +首先创建一个继承自 `DbContext` 的类 `BookDbContext`,用于配置和管理数据库连接。 + +**代码示例:** + +```csharp +using Microsoft.EntityFrameworkCore; + +namespace BookManage.Models; + +public class BookDbContext : DbContext +{ + public DbSet books { get; set; } = null!; + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + base.OnConfiguring(optionsBuilder); + var key = $"Server=localhost;database=BookDb;uid=sa;pwd=123456;TrustServerCertificate=True"; + optionsBuilder.UseSqlServer(key); + } +} +``` + +**知识点:** + +- **DbSet:** 用于操作实体 `T` 的表。 +- **OnConfiguring 方法:** 配置数据库连接字符串,这里连接的是 SQL Server。 + +------ + +### 2. 创建实体类 + +定义一个与数据库表对应的实体类 `Book`。 + +**代码示例:** + +```csharp +namespace BookManage.Models; + +public class Book +{ + public int id { set; get; } // 主键 + public string BookName { get; set; } = null!; // 书名 + public string Author { get; set; } = null!; // 作者 +} +``` + +**注意:** + +- 实体类的属性名将映射到数据库表的列。 +- 确保主键字段(如 `id`)命名规范,EF Core 会自动识别。 + +------ + +### 3. 安装所需依赖包 + +在项目中安装 EF Core 和相关工具包。 + +**安装步骤:** + +1. 安装 SQL Server 提供程序: + + ```bash + dotnet add package Microsoft.EntityFrameworkCore.SqlServer + ``` + +2. 安装设计工具包: + + ```bash + dotnet add package Microsoft.EntityFrameworkCore.Design + ``` + +3. 安装 EF Core CLI 工具: + + ```bash + dotnet tool install --global dotnet-ef + ``` + +------ + +### 4. 数据迁移与更新数据库 + +1. **添加迁移文件** + 运行以下命令生成迁移文件(`XXX` 为迁移名称,可以自定义)。 + + ```bash + dotnet ef migration add XXX + ``` + +2. **更新数据库** + 应用迁移到数据库: + + ```bash + dotnet ef database update + ``` + +------ + +### 5. 最终总结 + +**完整流程:** + +1. 创建 `DbContext` 和实体类。 +2. 安装依赖包。 +3. 使用 `dotnet ef` 命令生成迁移并更新数据库。 + +**注意事项:** + +- 数据库连接字符串中的账号和密码(`uid` 和 `pwd`)需要根据实际环境配置。 + +- 确保 SQL Server 服务已启动,并有权限访问数据库。 + +- 如果需要重新生成迁移,使用以下命令清除并重新生成: + + ```bash + dotnet ef migrations remove + ``` \ No newline at end of file diff --git "a/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/\347\274\226\350\276\221\347\275\221\351\241\265.md" "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/\347\274\226\350\276\221\347\275\221\351\241\265.md" new file mode 100644 index 0000000..9333d0e --- /dev/null +++ "b/\347\216\213\347\276\275\347\206\231/\347\254\224\350\256\260/\347\274\226\350\276\221\347\275\221\351\241\265.md" @@ -0,0 +1,166 @@ +# 编辑页面的实现 + +### 1. 功能概述 + +该页面用于编辑一本书的详细信息,包括 **书名** 和 **作者**。用户可以提交表单保存修改或返回列表页面。 + +------ + +### 2. 完整代码 + +```csharp +@model Book + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + +
+ + +``` + +------ + +### 3. 核心知识点 + +1. **绑定模型** + + - 使用 `@model Book` 将视图绑定到 `Book` 模型。 + + - 在视图中通过 + + ``` + asp-for + ``` + + 绑定表单字段与模型属性,例如: + + ```html + + ``` + +2. **隐藏字段** + + - ``` + id + ``` + + 字段为主键,不需要用户输入,因此将其隐藏并设置为只读: + + ```html + + ``` + +3. **表单验证** + + - 使用 HTML 属性 + + ``` + required + ``` + + 强制用户填写表单: + + ```html + + ``` + +4. **表单提交** + + - 表单通过 `asp-action="Create"` 指定提交到控制器的 `Create` 方法,使用 `POST` 方法传递数据。 + +5. **返回按钮** + + - 使用 JavaScript 为返回按钮绑定点击事件: + + ```javascript + document.querySelector(".fan").addEventListener('click', function (event) { + event.preventDefault(); + window.location.href = '@Url.Action("Index", "BookManage")'; + }); + ``` + +------ + +### 4. 界面说明 + +- 字段布局 + + : + + - ID 字段:隐藏且只读。 + - 书名和作者字段:必填项,用户需要输入有效数据才能提交。 + +- 按钮功能 + + : + + - **保存**:提交表单,将修改后的数据保存到数据库。 + - **返回列表**:跳转到 `BookManageController` 的 `Index` 方法,显示书籍列表页面。 + +------ + +### 5. 提示与优化 + +1. **添加客户端验证** + + - 推荐引入 ASP.NET Core 的客户端验证功能,通过 `jquery.validate.js` 实现实时验证。 + + - 在 + + ``` + _ViewImports.cshtml + ``` + + 中添加: + + ```csharp + @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers + ``` + +2. **表单样式优化** + + - 使用 CSS 设置更美观的表单样式,例如: + + ```html + + ``` + +3. **支持编辑模式** + + - 此页面既可以用于创建新书,也可以支持编辑书籍信息,通过设置 + + ``` + asp-action + ``` + + 为不同的方法: + + ```html +
+ ``` \ No newline at end of file -- Gitee