从零构建.NET全栈应用:ASP.NET Core MVC与EF Core实战教程
最近在带新人做项目时发现很多刚接触 .NET 全栈开发的同学面对 C#、ASP.NET Core、EF Core、SQL Server 这一套技术栈常常感到无从下手。环境搭建、项目结构、前后端交互、数据库操作每一步都可能遇到意想不到的坑。本文将以一个完整的“图书管理系统”为例手把手带你从零开始使用最新的 .NET 10、ASP.NET Core MVC、EF Core 和 SQL Server 2025结合 Bootstrap 5 前端框架构建一个功能齐全的全栈应用。无论你是刚学完 C# 语法的新手还是想从其他技术栈转型过来的开发者都能通过这篇教程系统地掌握 .NET 全栈开发的核心流程和工程化实践。1. 技术栈全景与核心概念在动手编码之前我们先来理解一下这套技术栈中每个组件扮演的角色以及它们如何协同工作。1.1 各组件职责解析C#这是我们整个应用的“编程语言”。它是一种强类型、面向对象的现代语言运行在 .NET 运行时上。你可以把它理解为构建整个应用大厦的“砖块”和“水泥”。.NET 10 / .NET 8这是微软推出的统一开发平台包含了运行时CLR、基础类库BCL和一系列 SDK 工具。我们选择 .NET 10或当前最新的 LTS 版本如 .NET 8意味着我们能使用最新的语言特性、性能优化和安全更新。它负责将我们写的 C# 代码编译成中间语言IL并在运行时管理内存、执行代码。ASP.NET Core MVC这是一个用于构建 Web 应用程序的框架。它基于 .NET 平台并采用了经典的MVCModel-View-Controller设计模式。Model模型代表应用程序的数据和业务逻辑。在我们的例子中Book、Author这些类就是模型。View视图负责呈现用户界面。通常是由 HTML、Razor 语法和 Bootstrap 组件构成的.cshtml文件。Controller控制器处理用户请求如点击链接、提交表单。它从 Model 获取数据然后选择合适的 View 来展示结果。ASP.NET Core是跨平台的可以在 Windows、Linux 和 macOS 上运行。Entity Framework Core (EF Core)这是一个对象关系映射器ORM。它的主要工作是充当 C# 对象我们的 Model和关系型数据库如 SQL Server之间的“翻译官”。我们不再需要手写大量的 SQL 语句来创建表、插入或查询数据而是通过操作 C# 对象由 EF Core 自动生成并执行对应的 SQL 命令。这极大地提高了开发效率和数据访问的安全性减少 SQL 注入风险。SQL Server 2025这是我们选择的关系型数据库管理系统RDBMS用于持久化存储应用数据如图书信息、作者信息。SQL Server 2025 是微软数据库产品线的最新版本注截至知识截止日期SQL Server 2022 是最新稳定版此处以“SQL Server 2025”代指最新或目标版本实际开发请使用 SQL Server 2019/2022 或更高版本。我们将通过 EF Core 与它交互。Bootstrap 5这是一个流行的前端CSS 框架。它提供了一套预制的、响应式的 UI 组件如按钮、表单、导航栏、卡片和工具类让我们能用很少的 CSS 代码快速构建出美观、且能在各种屏幕尺寸上正常显示的界面。1.2 数据流向与架构概览理解了单个组件后我们来看它们如何串联起来处理一次典型的用户请求例如“查看图书列表”用户在浏览器中输入网址或点击链接发起一个 HTTP 请求如GET /Books。请求到达 ASP.NET Core 应用。路由系统将请求映射到对应的Controller如BooksController和Action 方法如Index()。Controller中的Index方法调用EF Core。EF Core将操作如_context.Books.ToListAsync()翻译成 SQL 语句SELECT * FROM Books发送给SQL Server数据库。SQL Server执行查询并将结果集返回给 EF Core。EF Core将结果集水合Hydrate成 C# 对象列表ListBook返回给 Controller。Controller将这个书籍列表Model传递给对应的ViewViews/Books/Index.cshtml。View引擎Razor将 Model 数据与 HTML/Bootstrap 模板结合生成最终的 HTML 页面。ASP.NET Core 将这个 HTML 页面作为 HTTP 响应发送回用户的浏览器。浏览器渲染页面用户看到美观的图书列表。这个流程清晰地展示了从用户交互到数据持久化再返回视图的全过程这也是全栈开发的核心。2. 开发环境搭建与项目初始化工欲善其事必先利其器。我们先来准备好开发所需的全部工具。2.1 必备软件安装请按顺序安装以下软件并确保安装成功.NET SDK (10.0 或 8.0 LTS)前往 .NET 官方下载页面 。下载并安装最新的 .NET SDK建议选择 .NET 8.0 LTS 或更高版本教程命令通用。安装后打开命令行CMD、PowerShell 或终端输入dotnet --version应能显示版本号。集成开发环境 (IDE)Visual Studio 2022 (社区版免费)功能最全对 .NET 开发支持最好。 下载地址 。Visual Studio Code (免费)轻量级需额外安装 C# 扩展。适合喜欢简洁的开发者。 下载地址 。本教程后续命令行操作均通用。SQL Server 2022 Developer (或 Express) Edition前往 SQL Server 下载页面 。下载SQL Server 2022 Developer版本免费用于开发测试。运行安装程序在“功能选择”中至少勾选“数据库引擎服务”。安装过程中会提示你设置身份验证模式。请务必选择“混合模式SQL Server 身份验证和 Windows 身份验证”并为自己设置的sa账户设置一个强密码牢记它安装完成后建议安装SQL Server Management Studio (SSMS)这是一个图形化管理工具便于查看数据库。 SSMS 下载地址 。2.2 创建 ASP.NET Core MVC 项目我们将使用 .NET CLI命令行接口来创建项目这是最通用和高效的方式。打开终端在你想创建项目的目录下打开 PowerShell、CMD 或 Bash 终端。创建解决方案和项目# 创建一个名为 BookManagementSystem 的解决方案文件 dotnet new sln -n BookManagementSystem # 创建一个名为 BookManagementSystem.Web 的 ASP.NET Core MVC 项目 dotnet new mvc -n BookManagementSystem.Web -f net8.0 --auth Individual # 将项目添加到解决方案中 dotnet sln add BookManagementSystem.Web/BookManagementSystem.Web.csproj-f net8.0指定目标框架为 .NET 8.0与 .NET 10 开发体验高度一致。--auth Individual创建项目时包含个人用户账户的身份验证和授权脚手架。这对于大多数需要用户登录的系统非常有用它会自动生成注册、登录、管理账户的页面和逻辑。打开项目使用cd BookManagementSystem.Web进入项目目录然后用你的 IDE如code .用 VS Code 打开或用 Visual Studio 打开.sln文件打开项目。2.3 初始项目结构解析用 IDE 打开项目后你会看到类似如下的结构BookManagementSystem.Web/ ├── Controllers/ # 控制器类处理HTTP请求 ├── Models/ # 数据模型和视图模型 ├── Views/ # Razor视图文件 (.cshtml) ├── wwwroot/ # 静态资源 (CSS, JS, 图片) ├── appsettings.json # 应用程序配置 (如数据库连接字符串) ├── Program.cs # 应用程序的主入口和服务配置 └── BookManagementSystem.Web.csproj # 项目文件管理依赖这个结构是 ASP.NET Core MVC 的标准模板为我们提供了一个清晰的起点。3. 集成 Entity Framework Core 与 SQL Server接下来我们将 EF Core 和 SQL Server 驱动引入项目并配置数据库连接。3.1 安装必要的 NuGet 包在项目根目录BookManagementSystem.Web下运行以下命令# 安装 EF Core 的 SQL Server 数据库提供程序 dotnet add package Microsoft.EntityFrameworkCore.SqlServer # 安装 EF Core 的设计时工具用于生成数据库迁移 dotnet add package Microsoft.EntityFrameworkCore.Tools # 安装 EF Core 的脚手架工具可选用于从数据库生成模型 # dotnet add package Microsoft.EntityFrameworkCore.Design这些包会被自动添加到你的.csproj文件中。3.2 定义数据模型 (Model)在Models文件夹下我们创建两个类Author作者和Book图书。它们之间是一对多的关系一个作者可以写多本书。Models/Author.csusing System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace BookManagementSystem.Web.Models { public class Author { public int Id { get; set; } // 主键 [Required] [Display(Name 作者姓名)] [StringLength(100)] public string Name { get; set; } string.Empty; [Display(Name 简介)] [DataType(DataType.MultilineText)] public string? Bio { get; set; } // 可空类型表示字段可选 // 导航属性一个作者拥有多本书 public ICollectionBook Books { get; set; } new ListBook(); } }Models/Book.csusing System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace BookManagementSystem.Web.Models { public class Book { public int Id { get; set; } [Required] [Display(Name 书名)] [StringLength(200)] public string Title { get; set; } string.Empty; [Display(Name 国际标准书号)] [StringLength(20)] public string? ISBN { get; set; } [Required] [Display(Name 出版日期)] [DataType(DataType.Date)] public DateTime PublishDate { get; set; } [Display(Name 简介)] [DataType(DataType.MultilineText)] public string? Description { get; set; } // 外键指向 Author 表 [Display(Name 作者)] public int AuthorId { get; set; } // 导航属性一本书属于一个作者 [ForeignKey(nameof(AuthorId))] public Author Author { get; set; } null!; // 使用空包容运算符EF Core会处理 } }[Required],[StringLength],[Display],[DataType]这些是数据注解Data Annotations用于定义验证规则和显示信息它们会被 MVC 的模型绑定和验证系统以及 EF Core 的迁移所使用。[ForeignKey]属性明确指定了外键关系。3.3 创建数据库上下文 (DbContext)DbContext 是 EF Core 的核心类它代表与数据库的一个会话用于查询和保存数据。在Models文件夹或新建一个Data文件夹下创建ApplicationDbContext.csModels/ApplicationDbContext.csusing Microsoft.EntityFrameworkCore; namespace BookManagementSystem.Web.Models { public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptionsApplicationDbContext options) : base(options) { } // 将 C# 模型映射到数据库表 public DbSetBook Books { get; set; } public DbSetAuthor Authors { get; set; } // 可以在这里用 Fluent API 进行更复杂的配置可选 protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 示例为 Book 表的 Title 字段创建索引 modelBuilder.EntityBook() .HasIndex(b b.Title); // 示例设置级联删除规则当作者被删除时其所有书籍也被删除 modelBuilder.EntityBook() .HasOne(b b.Author) .WithMany(a a.Books) .HasForeignKey(b b.AuthorId) .OnDelete(DeleteBehavior.Cascade); } } }3.4 配置数据库连接字符串打开appsettings.json文件添加ConnectionStrings部分。将YourServerName和YourPassword替换为你安装 SQL Server 时的实际信息。appsettings.json{ ConnectionStrings: { DefaultConnection: Serverlocalhost;DatabaseBookManagementDB;Trusted_ConnectionTrue;TrustServerCertificateTrue; // 如果使用 SQL Server 身份验证请使用以下格式 // DefaultConnection: Serverlocalhost;DatabaseBookManagementDB;User Idsa;PasswordYourPassword;TrustServerCertificateTrue; }, Logging: { LogLevel: { Default: Information, Microsoft.AspNetCore: Warning } }, AllowedHosts: * }Serverlocalhost连接本地 SQL Server 实例。DatabaseBookManagementDB将要创建的数据库名称。Trusted_ConnectionTrue使用 Windows 身份验证推荐更安全。TrustServerCertificateTrue在本地开发时信任自签名证书避免连接错误。3.5 在 Program.cs 中注册服务打开Program.cs文件这是 ASP.NET Core 6 启动和配置服务的入口。Program.csusing BookManagementSystem.Web.Models; using Microsoft.EntityFrameworkCore; var builder WebApplication.CreateBuilder(args); // 从配置中读取连接字符串 var connectionString builder.Configuration.GetConnectionString(DefaultConnection); // 将 ApplicationDbContext 注册为服务使用 SQL Server builder.Services.AddDbContextApplicationDbContext(options options.UseSqlServer(connectionString)); // 添加其他默认服务如 MVC、身份认证等 builder.Services.AddControllersWithViews(); var app builder.Build(); // 配置 HTTP 请求管道... if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler(/Home/Error); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); // 确保在 UseRouting 之后UseEndpoints 之前 app.MapControllerRoute( name: default, pattern: {controllerHome}/{actionIndex}/{id?}); app.Run();至此EF Core 和 SQL Server 的集成配置完成。4. 使用 Code First 迁移创建数据库EF Core 的 Code First 方法允许我们通过 C# 代码模型来定义数据库结构然后通过“迁移Migration”命令来创建或更新数据库。创建初始迁移在终端中确保位于项目目录 (BookManagementSystem.Web)运行dotnet ef migrations add InitialCreate这个命令会扫描你的DbContext和所有DbSetT引用的模型与当前数据库状态目前为空进行比较然后在Migrations文件夹下生成一系列 C# 文件如20250101000000_InitialCreate.cs这些文件记录了创建Authors和Books表的 SQL 脚本。将迁移应用到数据库运行以下命令EF Core 会执行迁移文件中的 SQL在 SQL Server 中创建数据库和表。dotnet ef database update验证打开SQL Server Management Studio (SSMS)连接到你的本地服务器你应该能看到一个名为BookManagementDB的数据库里面包含Authors和Books两张表其结构与我们定义的模型一致。5. 实现 CRUD 功能与 MVC 协作现在我们为Book实体实现完整的增删改查CRUD功能。5.1 生成 Scaffolded 控制器和视图快速入门ASP.NET Core 提供了强大的脚手架工具可以根据模型自动生成控制器和视图。在项目目录下运行# 为 Book 模型生成带有视图的控制器使用 ApplicationDbContext dotnet aspnet-codegenerator controller -name BooksController -m Book -dc ApplicationDbContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries这个命令会在Controllers文件夹下创建BooksController.cs。在Views文件夹下创建Books子文件夹并生成Index,Create,Edit,Details,Delete等视图文件.cshtml。这是快速上手的绝佳方式生成后你立即可以# 1. 两数之和题目给定一个整数数组 nums 和一个整数目标值 target请你在该数组中找出 和为目标值 target 的那 两个 整数并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。思路使用哈希表将数组中的元素作为key下标作为value遍历数组如果target - nums[i] 在哈希表中存在那么返回两个下标如果不存在将当前元素和下标存入哈希表代码class Solution { public: vectorint twoSum(vectorint nums, int target) { unordered_mapint,int map; for(int i 0; i nums.size(); i) { // 遍历当前元素并且在map中寻找是否有匹配的key auto iter map.find(target - nums[i]); if(iter ! map.end()) { // 找到了 return {iter-second,i}; } // 如果没有找到匹配对就将访问过的元素和下标加入到map中 map.insert(pairint,int(nums[i],i)); } return {}; } };