展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > C#怎么使用Entity Framework Core_C# EF Core入门到实战教程【进阶】

C#怎么使用Entity Framework Core_C# EF Core入门到实战教程【进阶】

EFCore使用需协同模型定义、上下文配置与迁移机制,否则SaveChanges易失败。实体类主键需符合约定或用[Key]标记,迁移需执行databaseupdate。查询用AsNoTracking提升只读性能,关联查询用Include避免N+1。DbContext应注册为Scoped,避免连接池耗尽。

要说清楚 EF Core 为什么用起来总遇到坑,先得明白一个基本前提:它不是那种“装个包就能查数据”的傻瓜工具。要搞定 EF Core,关键就在于模型定义、上下文配置和迁移机制这三件事得协同好,一个都不能漏。缺了哪一环,Sa veChanges() 要么悄无声息地失败,要么直接抛出一个 InvalidOperationException——绝不会给你一个你以为的数据库错误提示。

所以,别指望写完一个 public class AppDbContext : DbContext 就万事大吉。EF Core 根本不知道你要连哪个数据库,也不知道用哪种数据库驱动。如果没有在 OnConfiguring 方法里配置连接串,或者没有通过依赖注入传入配置选项,运行时会直接报 No database provider has been configured。这算是入门最常见的拦路虎。

具体怎么配?本地开发做快速验证,直接在 OnConfiguring 里调用 optionsBuilder.UseSqlite("Data Source=app.db") 或者 UseSqlServer(...) 就够用。但到了生产环境,就别这么玩硬编码了。推荐走依赖注入 + appsettings.json 的方式,既灵活又便于切换环境——比如开发用 SQLite,测试用 SQL Server,发布时改成生产数据库。还有一个细节容易被忽略:SQLite 的路径一定要确认好权限。Windows 下用 Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) 这种写法,比自己写死一个 C:\temp 路径可靠得多。

接着是实体类定义里的坑。

EF Core 默认按约定找主键:属性名叫 IdBlogId(类名加 Id),并且类型是 intlongGuid 这类。如果你写成了 public int blog_id { get; set; },它不会识别为主键。生成的迁移里就没有 PRIMARY KEY,这时候 dotnet ef migrations add 可能还能通过,但执行 dotnet ef database update 时就会卡在建表这一步。

有几种方式可以强制指定主键:用 [Key] 特性,或者在 Fluent API 里写 modelBuilder.Entity().HasKey(e => e.BlogId)。另外,string 类型默认会映射为 nvarchar(max),插入超长内容不会报错,但性能会明显下降。建议加上 [StringLength(200)],这样才会生成指定长度的 nvarchar(200) 字段。

还有个容易被忽略的点:从 EF Core 6 开始,非空引用类型字段必须要有默认值,或者显式标记为可空。否则编译能过,运行时却会报 InvalidOperationException,提示你“The property 'Name' cannot be marked as nullable”。

再来看迁移机制。很多人以为 dotnet ef migrations add 是“一键同步”数据库,其实根本不是。它只是生成一个 C# 文件,里面包含了 Up(MigrationBuilder migrationBuilder)Down(MigrationBuilder migrationBuilder) 两个方法。真正修改数据库结构的是 dotnet ef database update——它只会执行最后一次迁移的 Up 方法,而不是把所有迁移叠加执行一遍。

这块有几个常见误区要特别留意:

第一,删掉迁移文件夹再重新 add,并不会清空已有的数据库。它只会让 EF Core 认为当前的模型就是初始状态。如果后续调用 update,可能因为数据库里已存在某些表但迁移记录对不上而导致报错。

第二,修改了实体类之后,忘了 add 新迁移就直接 update,EF Core 会静默跳过,数据库结构完全不变。但你的代码里新增的表或字段是没办法正常读取和写入的。

如果你需要把迁移脚本导出到 SQL 做审核,推荐使用 dotnet ef migrations script --idempotent,而不是靠 update 在里面猜效果。

查询性能方面,最常用也最容易忽略的一个优化点是 AsNoTracking()

默认情况下,EF Core 会对每一次查询结果开启变更跟踪(Change Tracking)。这意味着你查了 1000 条 Blog 记录,EF Core 就会在内存里维护 1000 个实体快照。如果你只是展示列表、不打算修改任何数据,这完全是浪费内存和 CPU 算力。

对于只读场景,习惯性加上 context.Blogs.AsNoTracking().ToList()。做关联查询时,像查 Blog 带 Posts 这种场景,一定要用 .Include(b => b.Posts),否则会触发 N+1 查询——你查了 100 个 Blog,后续会额外发出 100 次 SQL 去查 Posts,性能简直灾难。

还有一个技巧:FindAsync() 内部是走主键索引的,并且自动启用了 AsNoTracking(仅限单条记录)。它比 Where(x => x.Id == id).FirstOrDefaultAsync() 略快一点,但语义上略有不同。两者在查不到数据时都返回 null,区别主要在缓存行为上。

最后提醒一个容易被忽视、但后果却很严重的问题:DbContext 是有生命周期的。

如果你把它当作静态单例来用,或者在 Web API 里手动 new 出来而不及时 Dispose,迟早会碰到连接池耗尽、并发修改异常或者内存泄漏。 .NET 6 之后的标准做法是注册为 Scoped,让 DbContext 随着 HTTP 请求的创建而创建,请求结束自动释放。既安全又高效。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。