写于 2024 年,当时读的是第二版,书里主要讲 EF Core 5。现在 EF Core 9 都出来了,其中大部分写法已经有了更好的做法,这条只留着做存档,别照着做。下面 12 条是当年边读边记的,原样放着。

  1. DbContext 尽量短命,一次请求一个,别当成全局单例长期持有。
  2. 查询用 AsNoTracking() 能省掉变更追踪的开销,只读场景一定要加。
  3. 导航属性延迟加载方便,但容易在循环里偷偷打出 N+1 条 SQL,要注意。
  4. Include 预加载关联数据时,别一次性 Include 太深,否则 SQL 会很大。
  5. 批量插入老老实实用 AddRange 再 SaveChanges,别指望它快,量大的另想办法。
  6. 迁移(Migration)要提交到代码库,别只留本地的,不然别人拉下来跑不起来。
  7. HasIndex 在模型里建索引,比手敲 SQL 建索引好维护。
  8. 并发冲突用 RowVersionIsRowVersion 来处理,比自己加锁省心。
  9. 原生 SQL 用 FromSqlRaw 时,参数一定要走参数化,别拼字符串。
  10. 日志里能看到生成的 SQL,排查性能问题第一件事就是把它打出来看。
  11. 值对象用 OwnsOne 映射,能让领域模型干净一点。
  12. 不要为了「不用写 SQL」而硬上 EF,复杂报表还是直接写存储过程更合适。

当时读这本书,一半是为了补 EF Core 的基础,一半是工作里真的被 LINQ 生成的 SQL 坑过。书里很多例子我都在公司那套系统的测试库上照着跑了一遍,所以这几条不是纯抄书,是带了自己跑出来的体会。不过话说回来,体会归体会,现在 EF Core 都到 9 了,第 8 条关于 RowVersion 的写法、第 11 条 OwnsOne 的用法,新版本里都有更顺手的替代,别照抄。

这几条现在回头看,第 5 条关于批量插入的说法在 EF Core 7 之后已经不准确了——ExecuteUpdate 出来之后批量更新快很多。所以再次提醒,这篇文章只作存档,真要学去看新版文档。当时我读得也不算细,有几处是草草记下的,不一定严谨。