当前位置: 首页 > news >正文

注入燃料——Entity Framework Core 与 Code First 实战

前言:从内存到持久化

在之前的文章中,我们的数据都保存在内存列表里。一旦程序重启,数据就会丢失。在企业级开发中,数据是核心资产,必须安全地存储在数据库中。

传统开发模式下,你需要手写SQL语句(CREATE TABLE...SELECT * FROM...),这不仅繁琐,而且容易出错,还需要处理数据库连接池、事务等复杂逻辑。

Entity Framework Core (EF Core)解决了这些问题。它是一个ORM(Object-Relational Mapper,对象关系映射器)。它就像一个智能翻译官,能把你写的C#对象自动翻译成数据库里的表,把你调用的C#方法自动翻译成SQL语句。

你只需操作C#对象,EF Core帮你搞定数据库。

二、实战准备:定义数据模型

我们将构建一个经典的“待办事项管理”系统。

2.1 安装依赖包

首先,我们需要引入EF Core的核心包以及数据库驱动。本文以最常用的SQL Server为例(即使你没安装SQL Server,也可以使用LocalDB或SQLite,后文会讲)。

在项目根目录下,打开终端执行以下命令:

dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design

2.2 定义实体类

我们定义一个TodoItem类。注意,这次我们使用传统的class而非record,因为在EF Core中,实体通常需要属性的可变性,且class对导航属性(关联关系)的支持更为成熟。

创建Models/TodoItem.cs

namespace MyTodoApp.Models; // 这是一个实体类,对应数据库中的一张表 public class TodoItem { // 主键。EF Core约定:名为 Id 或 <类名>Id 的属性会被自动设为主键 public int Id { get; set; } // 任务标题 public string? Title { get; set; } // 是否完成 public bool IsDone { get; set; } // 创建时间 public DateTime CreatedAt { get; set; } = DateTime.Now; }

三、数据库上下文:代码与数据库的桥梁

这是EF Core中最核心的概念。DbContext负责管理实体对象与数据库的会话状态。

创建Data/AppDbContext.cs

using Microsoft.EntityFrameworkCore; using MyTodoApp.Models; namespace MyTodoApp.Data; // 继承自 DbContext public class AppDbContext : DbContext { // 构造函数:接收 DbContextOptions,用于配置数据库连接 public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } // DbSet 对应数据库中的表。 // 属性名 Todos 将成为数据库表名(EF Core默认约定为复数形式) public DbSet<TodoItem> Todos { get; set; } // 高级配置:可以通过 Fluent API 在这里配置映射关系 protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 示例:如果不想用默认的表名,可以在这里指定 // modelBuilder.Entity<TodoItem>().ToTable("TaskItems"); } }

刚子解读AppDbContext就像一个仓库管理员。DbSet<TodoItem> Todos就是仓库里的一个货架。你往Todos里添加对象,管理员就会记下来,等到SaveChanges时,他会把货架上的东西搬运到真正的数据库里。

四、依赖注入与数据库连接

回到Program.cs,我们需要告诉应用程序:使用哪个数据库?连接字符串是什么?

4.1 配置连接字符串

打开appsettings.json,添加连接字符串:

{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { // 这里使用 LocalDB,它是VS自带的轻量级SQL Server,无需安装额外软件 // 如果你有真正的SQL Server,将 Data Source 改为你的服务器地址 "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyTodoDb;Trusted_Connection=True;MultipleActiveResultSets=true" } }

4.2 注册服务

Program.cs中注册 DbContext:

using Microsoft.EntityFrameworkCore; using MyTodoApp.Data; var builder = WebApplication.CreateBuilder(args); // ... 其他服务注册 ... // 注册 DbContext builder.Services.AddDbContext<AppDbContext>(options => { // 从配置文件读取连接字符串 options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); }); var app = builder.Build(); // ... 中间件配置 ...

【刚子提示】这里我们使用了AddDbContext,默认生命周期是Scoped。这意味着在一次HTTP请求中,无论你注入多少次AppDbContext,拿到的都是同一个实例。这保证了事务的一致性,非常符合Web开发的需求。

五、见证奇迹:Code First 迁移

现在是激动人心的时刻。我们还没建数据库,甚至没装数据库管理工具。我们将通过代码“变”出一个数据库。

5.1 理解迁移

迁移是EF Core的版本控制系统。每当你修改了实体类(比如加个字段),你就创建一个迁移文件,记录这次变更。EF Core会根据这个文件更新数据库结构。

5.2 创建并执行迁移

确保已安装工具:

dotnet tool install --global dotnet-ef

在项目根目录执行:

# 1. 创建迁移:给这次变更起个名字,比如 InitialCreate dotnet ef migrations add InitialCreate # 2. 更新数据库:执行迁移,生成数据库表 dotnet ef database update

http://www.gsyq.cn/news/1590764.html

相关文章:

  • AI 建议直接升级依赖版本,为什么编译通过后仍可能在运行时 `NoSuchMethodError`
  • 如何正确地“拷贝”一个对象?(深拷贝与浅拷贝)
  • Navicat密码查看工具:终极解决方案帮你找回忘记的数据库密码
  • GEO优化公司能解决企业的什么问题?从AI搜索流量到品牌认知的全面解读
  • AI写论文神器来袭!4款AI论文生成工具,让论文写作更高效!
  • Github 开源社区中 AMD ROCm 相关项目的筛选技巧
  • Gophish管理员密码丢失?SQLite数据库哈希重置实战指南
  • 中兴光猫超级管理员权限获取完整指南:3步开启工厂模式
  • Buzz:终极开源语音转录工具,打造高效音频处理工作流
  • 【JAVA毕设源码分享】基于SpringBoot技术的防盗门进销存管系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 告别下载烦恼:3步解锁全网视频音频资源的终极解决方案
  • Go语言的runtime.SetBlockProfileRate阻塞剖析数据收集与分析工具集成
  • Java CompletableFuture 的异步流设计
  • 数据分包传输:从原理到实践,解决大文件传输与网络不稳定的关键技术
  • 模型压缩技术:剪枝、量化与知识蒸馏的方法
  • 技术辩论中的论点构建与证据支持
  • 物理信息神经网络(PINN)求解反演偏微分方程实战指南
  • NoSleep:Windows防休眠工具的终极解决方案,告别自动锁屏困扰
  • 嵌入式通信协议PESP:轻量级数据交换的设计范式与实战解析
  • 2026实测对比:5家工业电源厂家深度评测,避坑指南与口碑分析
  • Retire.js与OWASP ZAP集成:构建前端依赖与运行时安全的自动化检测闭环
  • 【软工方法论23】代码坏味道识别与消除
  • 【无标题】AI API 聚合平台:大模型时代的一站式基础设施
  • Go语言的runtime.MemProfile中的诊断
  • 拆开宝珀五十噚Tech常驻款,这处机芯打磨让专柜销售闭嘴
  • 第三视觉理解徐玉生与他的商业活动(2)
  • 为什么NuGet下载量是.NET生态的晴雨表
  • 如何一站式解决Windows程序DLL缺失问题?VisualCppRedist AIO自动化工具全解析
  • 进程内套接字流转与无网路由仿真:基于 Flask 请求生命周期与 Requests 内存拦截的 Pytest 全链路微服务网络治理
  • Abode AN安装包