写于 2024 年,当时读的是第二版,书里主要讲 EF Core 5。现在 EF Core 9 都出来了,其中大部分写法已经有了更好的做法,这条只留着做存档,别照着做。下面 12 条是当年边读边记的,原样放着。
- DbContext 尽量短命,一次请求一个,别当成全局单例长期持有。
- 查询用
AsNoTracking()能省掉变更追踪的开销,只读场景一定要加。 - 导航属性延迟加载方便,但容易在循环里偷偷打出 N+1 条 SQL,要注意。
- 用
Include预加载关联数据时,别一次性 Include 太深,否则 SQL 会很大。 - 批量插入老老实实用
AddRange再 SaveChanges,别指望它快,量大的另想办法。 - 迁移(Migration)要提交到代码库,别只留本地的,不然别人拉下来跑不起来。
- 用
HasIndex在模型里建索引,比手敲 SQL 建索引好维护。 - 并发冲突用
RowVersion加IsRowVersion来处理,比自己加锁省心。 - 原生 SQL 用
FromSqlRaw时,参数一定要走参数化,别拼字符串。 - 日志里能看到生成的 SQL,排查性能问题第一件事就是把它打出来看。
- 值对象用
OwnsOne映射,能让领域模型干净一点。 - 不要为了「不用写 SQL」而硬上 EF,复杂报表还是直接写存储过程更合适。
当时读这本书,一半是为了补 EF Core 的基础,一半是工作里真的被 LINQ 生成的 SQL 坑过。书里很多例子我都在公司那套系统的测试库上照着跑了一遍,所以这几条不是纯抄书,是带了自己跑出来的体会。不过话说回来,体会归体会,现在 EF Core 都到 9 了,第 8 条关于 RowVersion 的写法、第 11 条 OwnsOne 的用法,新版本里都有更顺手的替代,别照抄。
这几条现在回头看,第 5 条关于批量插入的说法在 EF Core 7 之后已经不准确了——ExecuteUpdate 出来之后批量更新快很多。所以再次提醒,这篇文章只作存档,真要学去看新版文档。当时我读得也不算细,有几处是草草记下的,不一定严谨。