EF6 与 EF Core 实战全解:从 EDMX 到 Code First / DB First,一篇就够了

发布时间:2026/7/23 2:23:26
EF6 与 EF Core 实战全解:从 EDMX 到 Code First / DB First,一篇就够了 EF6 与 EF Core 实战全解从 EDMX 到 Code First / DB First一篇就够了文章导读本文不堆砌官方术语而是从一位实际写过 EF6 项目、又转战 EF Core 的开发者视角出发彻底讲透EF6 (EDMX)、EF Core Code First与EF Core DB First的本质区别、适用场景及避坑指南。1. 开篇你为什么会点开这篇文章如果你曾经在 Visual Studio 中对着.edmx文件右键“从数据库更新模型”而现在却要在 .NET 8 项目中面对黑框框敲命令行你一定会产生一种巨大的割裂感。很多初学者甚至老手都会陷入一个误区认为 EF6 和 EF Core 的区别就是“连接数据库的方式不同”。但真相是连接方式几乎没变真正革命的是“映射Mapping”的诞生源头和变更方向。下文将为你彻底拆解。2. 宏观对比两代 ORM 的“基因”不同在深入三种开发模式之前先看 EF6 和 EF Core 作为框架本身的底层差异对比维度EF6 (.NET Framework)EF Core (.NET 8)设计年代旧时代产物专为 .NET Framework 设计现代 .NET 产物为跨平台和云原生设计运行平台仅限 Windows跨平台Windows / Linux / macOS核心架构紧耦合、单体式设计轻量级、模块化按需引入 Provider性能表现基准性能较弱批量操作效率低查询优化极佳内存占用更低速度更快开发现状仅维护不再增加新功能主力开发所有新特性只在这里更新结论新项目请无脑选 EF Core.NET 8EF6 只用于维护遗留系统。3. 三足鼎立三种开发模式的“权力游戏”我们日常讨论的三种模式EF6 EDMX、EF Core DB First、EF Core Code First本质上是“谁向谁同步”的问题。对比维度EF6 EDMX可视化EF Core DB First脚手架EF Core Code First代码优先核心工具Visual Studio 右键新增向导Scaffold-DbContext命令行Add-MigrationUpdate-Database命令行映射载体.edmxXML 文件C# 实体类 数据注解C# 实体类 Fluent API谁是老大数据库是老大数据库是老大代码是老大获得实体类的方式可视化拖拽/选择VS自动生成命令行自动反向工程Reverse Engineering开发者纯手写C# 类数据库变更后右键 .edmx - “从数据库更新模型”重新执行Scaffold -Force强制覆盖修改 C# 类 - 执行Add-Migration记录变更 -Update-Database执行变更版本控制友好度⚠️ 极差.edmx 是巨大 XML极易冲突⚠️ 一般自动生成的代码量大但纯文本胜于 XML✅极好全是手写逻辑合并冲突容易解决适用场景仅限 .NET Framework 遗留系统数据库已存在DBA 建好表或接手的旧库全新项目数据库完全从零开始4. 最大误区澄清“连接”与“映射”是两码事很多人包括刚开始聊天的我会误以为这些模式的区别在于怎么连数据库。连接Connection指程序通过 IP、端口、账号密码找到数据库。EF6 写在App.config里。EF Core 统一写在appsettings.jsonProgram.cs依赖注入中。这一点三种模式完全一样映射Mapping指 C# 的User.Name如何对应数据库的Name字段。这才是三种模式的本质区别映射是画在 XML 上EDMX还是从库里面拓印出来Scaffold还是你亲手敲出来的Code5. 深度解析两个 “First” 到底怎么选如果你正在启动一个新项目一定会在 Code First 和 DB First 之间纠结。这里给你一套决策树️ 选 Code First手写类 迁移特征你拥有类的“编辑权”数据库只是代码的镜像。流程新建User.cs手写属性 - 敲Add-Migration- 敲Update-Database。适合新项目、敏捷开发、数据库结构频繁变动、团队不爱写 SQL。优点完美契合 Git 工作流代码即文档。注意千万别手动去数据库改表结构否则迁移会报错。️ 选 DB FirstScaffold 命令行特征数据库拥有“决定权”代码只是数据库的临摹品。流程敲Scaffold-DbContext 连接串 Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models- 代码自动生成。适合DBA 管控严格、有现成复杂库、存储过程较多。优点零误差映射数据库极大节省手写时间。警告千万不要修改自动生成的实体类否则下次加-Force重新生成时你的代码会被覆盖。6. 实战避坑指南来自一线开发的血泪史如果你是从 EF6 转到 EF Core以下三个“惯性思维”陷阱必须注意找不到可视化设计器正常EF Core 彻底移除了.edmx。请习惯使用Scaffold-DbContext或手写类。忘记那个蓝色窗口吧。查询关联表返回 NullEF6 默认开启延迟加载Lazy Loading点order.Customer就能查出客户。EF Core默认关闭延迟加载必须显式使用.Include(o o.Customer)否则返回 Null。这是为了性能优化。如何防止自动生成的代码被覆盖核心技巧利用 C# 的“分部类Partial Class”。自动生成了User.cs你新建一个User.Partial.cs文件用partial class User写业务逻辑。这样无论重新生成多少次你的自定义逻辑都完好无损。7. 总结一句话记住它们的区别EF6 和 EF Core DB First 本质相同都是“数据库驱动开发”——由数据库表结构反向生成实体映射而 EF Core Code First 则是“代码驱动开发”——由手写的实体类正向生成数据库表结构。当你维护老系统认清 EF6 的.edmx玩法。当你面对 DBA 建好的库掏出Scaffold-DbContext命令。当你开启全新的项目忘掉数据库拿起键盘享受纯 C# 编码让Add-Migration去建表。尾声框架只是工具理解“数据流向”比记住命令更重要。希望这篇博客能成为你桌面上的速查手册。Happy Coding