From 9111f536e96f96dd712aacf7d9d86928900638a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=98=89=E6=80=A1=E5=A4=A7=E5=B8=85=E5=93=A5?= <2654312426@qq.com> Date: Mon, 16 Dec 2024 12:19:24 +0800 Subject: [PATCH] 1216 --- ...r \346\225\260\346\215\256\345\272\223.md" | 261 ++++++++++++++++++ ...45\350\257\242\350\257\255\345\217\245.md" | 157 +++++++++++ 2 files changed, 418 insertions(+) create mode 100644 "19\344\275\225\345\230\211\346\200\241/20241209-\344\275\277\347\224\250 Entity Framework Core \350\277\236\346\216\245 SQL Server \346\225\260\346\215\256\345\272\223.md" create mode 100644 "19\344\275\225\345\230\211\346\200\241/20241211-LINQ\351\233\206\346\210\220\346\237\245\350\257\242\350\257\255\345\217\245.md" diff --git "a/19\344\275\225\345\230\211\346\200\241/20241209-\344\275\277\347\224\250 Entity Framework Core \350\277\236\346\216\245 SQL Server \346\225\260\346\215\256\345\272\223.md" "b/19\344\275\225\345\230\211\346\200\241/20241209-\344\275\277\347\224\250 Entity Framework Core \350\277\236\346\216\245 SQL Server \346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 0000000..4d4c9f8 --- /dev/null +++ "b/19\344\275\225\345\230\211\346\200\241/20241209-\344\275\277\347\224\250 Entity Framework Core \350\277\236\346\216\245 SQL Server \346\225\260\346\215\256\345\272\223.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/19\344\275\225\345\230\211\346\200\241/20241211-LINQ\351\233\206\346\210\220\346\237\245\350\257\242\350\257\255\345\217\245.md" "b/19\344\275\225\345\230\211\346\200\241/20241211-LINQ\351\233\206\346\210\220\346\237\245\350\257\242\350\257\255\345\217\245.md" new file mode 100644 index 0000000..33e4300 --- /dev/null +++ "b/19\344\275\225\345\230\211\346\200\241/20241211-LINQ\351\233\206\346\210\220\346\237\245\350\257\242\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