《你必须掌握的Entity Framework 6.x与Core 2.0》书籍出版
前言
到目前为止写过刚好两百来篇博客,看过我博客的读者应该大概知道我每一篇博客都沿袭着一贯的套路,从前言到话题最终到总结,本文依然是一如既往的套路,但是不是介绍技术,也可说是介绍技术,不过是介绍书中的技术以及我对写作的态度,作为对本书的宣传,本书在最近即将出版,到时会在博客公告栏中放出购买链接。
写作初衷
之前有过出版社的编辑找我写书,我当时看了看也没回复最终当然也就是不了了之了,最主要的是觉得自己资历尚浅,写书和写博客有很大不同,写博客在言语上可以略微随意,而写书需要的是严谨同时在表达上也应言简意赅,后来怎么又写上了呢,看了看自己写的博客当属EF最多,记得在我初次学习EF时,我还特意搜索了下有没有相关中文的书籍作为参考资料,然而几乎一本都没有,后来我只能看看园中前辈们的博客和老外的文章来学习,最终也就写了一部分不算完整的EF系列,这个时候我想到是不是可以写一本EF 6.x和EF Core 2.0的书籍呢?作为EF 6.x和EF Core 2.0系统性学习的参考资料,若能帮助到初学和想继续深入的同行将再好不过了,也算是我对.NET作出的一份努力,同时也希望通过本书让您重新拾起对EF和EF Core的正确认知。
写作态度
从选题材到写完书大概耗时半年多的时间,在写EF篇章时脚步稍微快些,因为之前写过,只是在其过程中EF更新了一点点内容就花了一点时间去看文档,所以相对来说比较熟练一点,到了EF Core篇章脚步放缓了很多,虽然我也有写过,但是还不够深入,所以相当于写本书我从头又学习了EF和EF Core并深入探索到一些不为人知的秘密。写完后不久就开始了审稿,接着编辑那边将问题统一归纳交由我修改,同时我也秉着对自己负责和对读者负责的态度认真去修正文档中的错误,丝毫不敢懈怠,修改了有问题的地方以及添加了部分内容,都是在凌晨发给了编辑(【捂脸】),在这里要对编辑说声抱歉。以下是我从写作开始到书正式出版的详细记录。
你必须掌握的Entity Framework 6.x和Core 2.0
书籍名称如博客标题所言,您也可将本书看做是您所不知道的Entity Framework 6.x和 Core 2.0,比如您是否知道EF 6.0如何创建索引呢?比如您又是否知道在EF 6.x中如何正确更新数据呢?比如您又是否知道在EF Core中何种情况下即通过lambda表达式使用Include来进行饥饿加载不好使呢?比如您又是否知道在EF Core中通过Find或者FindAsync方法如何进行饥饿加载呢?比如您又是否知道EF Core上下文实例池本质是什么呢?这样的疑问还有太多太多,本书如管中窥豹,带您一探究竟。本书既面向基础学习者也面向进阶学习者,无论您是自学还是在项目中用到了EF 6.x抑或是EF Core 2.0,本书将对您或许有一定帮助。
推荐致谢
只见过张善友大哥,与其他几位大佬素未谋面,不知是否能够得到大佬们的认可,怀着忐忑的心情去找大佬们写推荐,结果大佬们很快写完就交给我了,在此表示感谢,感谢dudu老大、何镇汐大哥,张善友大哥,赵培(好基友),邹琼俊大哥,感谢大佬们在百忙之中抽空为本书做推荐,感谢大佬们对本书的认可和支持。这里额外打个小广告:何镇汐大哥现作为.NET Core中国社区项目成员之一,以一己之力开发.NET Core平台下的应用框架(https://github.com/dotnetcore/Util),感谢何镇汐大哥对.NET Core所作出的贡献,同时也期待有志之士能够参与进来。
写作目录
第一篇 1
第 1 章 7
EntityFramework历史 7
1.1 EntityFramework版本介绍 7
1.2 EntityFramework 领域建模方式 9
1.2.1 Code First 9
1.2.2 Model First 10
1.2.3 Database First 10
1.3 使用EntityFramework Code First 6.x 或Core 2.0的原因 10
1.4 小结 11
第 2 章 12
数据库表创建和迁移 12
2.1 数据库连接和初始化策略 12
2.1.1 数据库连接 12
2.1.2 数据库初始化策略 15
2.2 约定 17
2.2.1 类型发现 17
2.2.2 主键约定 17
2.2.3 关系约定 19
2.2.4 复杂类型约定 20
2.2.5 自定义约定 21
2.3 基于代码配置(Code-based Configuration Settings) 29
2.4 配置属性映射和关系映射 32
2.4.1 属性映射 32
2.4.2 关系映射 50
2.4.3 私有化属性映射 67
2.5 继承映射策略 69
2.5.1 Table per Hierarchy (TPH) 70
2.5.2 Table per Type (TPT) 70
2.5.3 Table per Concrete class (TPC) 73
2.5.4 Entity Splitting 77
2.5.5 Table Splitting 80
2.6 代码迁移 82
2.6.1 迁移命令 82
2.6.2 迁移本质 91
第 3 章 102
实体状态和数据操作 102
3.1 实体状态 102
3.2 数据操作 105
3.2.1 数据查询 105
3.2.2 数据保存 124
3.2.3 自动生成存储过程 135
3.3 避免陷阱
3.3.1 导航属性查询
3.3.2 分页查询
3.3.3 语义可空
3.3.4 表值函数
3.3.5 日期操作
3.4 基础篇实战 138
3.4.1 复杂属性作为JSON存储数据库表列 138
第二篇 153
第 4 章 155
上下文管理和变更追踪原理 155
4.1 上下文生命周期管理 155
4.1.1 基础模式追溯 155
4.1.2 生命周期追溯 157
4.1.3 进化模式追溯 160
4.2 变更追踪原理 163
4.2.1 快照式变更追踪(Snapshot based Change Tracking) 163
4.2.2 代理式变更追踪(Notification based Change Tracking with Proxies) 165
第 5 章 175
变更追踪原理和日志管理 175
5.1 DetectChanges原理 175
5.1.1 DetectChanges用途 175
5.1.2 调用DetectChanges方法时机 177
5.1.3 关闭自动调用DetectChanges方法 180
5.1.4 遗忘的二进制属性和复杂类型 182
5.2 日志记录 186
5.2.1 ToString打印 186
5.2.2 简单日志打印 187
5.2.3 结构化日志输出 190
5.2.4 构造块拦截 192
5.2.5 拦截器异常性能监控 197
5.2.6 拦截器解决EF 6.1忽略字符串空格历史遗留问题 211
5.3 事务 215
5.4 连接弹性 240
第 6 章 246
并发冲突 246
6.1 初级版解析 246
6.2 中级版解析 252
6.2.1 客户端获胜 253
6.2.2 数据库获胜 254
6.2.3 客户端和数据库合并获胜 255
6.3 高级版解析 256
6.3.1简单重试策略 257
6.3.2 Polly重试策略 257
第 7 章 262
性能优化实践 262
7.1 优化一:预编译视图 262
7.2 优化二:减少首次与数据库交互代码 266
7.3 优化三:NGen安装EntityFramework程序集 269
7.4 优化四:AsNoTracking 271
7.5 优化五:DbFunctions/SqlFunctions 271
7.6 优化六:缓存 276
7.7 优化七:重新编译查询 282
7.8 优化八:避免’N+1’ Select查询 287
7.9 优化九:添加索引 289
7.10 优化十:关闭回调DetectChanges方法 293
7.11 优化十一:使用异步查询 296
第 8 章 297
EntityFramework 6.x实战 297
8.1 工作单元泛型仓储模式(Generic Repository and a Unit of Work) 297
8.2 依赖注入泛型仓储模式(Generic Repository Pattern and Dependency Injection) 321
第三篇 338
第 9 章 340
数据库表创建和迁移 340
9.1 数据库初始化策略 340
9.2 配置属性映射和关系映射 344
9.2.1 属性映射 345
9.2.2 Backing Fields 357
9.2.3 Alternate Keys 362
9.2.4. Shadow Property 363
9.2.5 Owned Entities 368
9.2.6 HasQueryFilter 369
9.2.7 关系映射 371
9.2.8 继承映射 393
9.3 代码迁移 398
9.3.1 控制台程序迁移 398
9.3.2 Web应用程序迁移 400
9.3.3 多个上下文迁移 413
9.3.4 脚手架逆向迁移 417
第 10 章 422
数据操作和初始化数据 422
10.1 实体状态 422
10.2 数据操作 423
10.2.1 数据查询 423
10.2.2 数据保存 446
10.3 无连接实体 452
10.4 初始化数据 455
第四篇 459
第 11 章 461
性能优化实践 461
11.1 AsNoTracking 461
11.2 EF.Functions.Like 463
11.3 自定义标量函数 466
11.4 显式编译查询 470
11.5 上下文实例池 473
第 12 章 479
查询实体元数据和模型数据验证 479
12.1 查询元数据 479
12.2 内置模型验证 481
12.3 第三方扩展模型验证 484
第 13 章 488
上下文实例创建方式 488
13.1 显式创建上下文实例 488
13.1.1 带有构造函数的OnConfiguring方法 488
13.1.2 传递连接字符串参数到构造函数 489
13.1.3 使用不带依赖注入的DbContextOptions 489
13.2 依赖注入容器创建上下文实例 490
13.2.1 带有无参构造函数的DI 490
13.2.2 带DbContextOptions的DI 491
13.3.3 使用泛型DbContextOptions 491
13.3.4 使用AddDbContext/AddDbContextPool 492
第 14 章 494
实现多租户 494
第 15 章 504
捕获审计数据 504
第 16 章 510
变更追踪策略和日志管理 510
16.1 变更追踪策略 510
16.1.1 INotifyPropertyChanged 511
16.1.2 INotifyPropertyChanging 514
16.2 日志管理 516
16.2.1 添加控制台包输出 516
16.2.2 自定义日志输出 517
第 17 章 521
xUnit单元测试 521
17.1 控制台单元测试 522
17.2 NET Core Web应用程序单元测试 524
第 18 章 527
事务和并发冲突 527
18.1 事务 527
18.2 并发冲突 533
18.2.1 初级版解析 534
18.2.2 中级版解析 538
18.2.3 高级版解析 543
第 19 章 550
EntityFramework Core 2.1待发布 550
19.1 新特性实现目标 550
总结
本书是我所理解的EF 6.x和EF Core 2.0,也有我个人的一些思考,若本书能够对您有所帮助,那么如我写博客一样成就感就在于此了,期待本书能够得到您的认可,我会一如既往和大家分享我所得。
购买通知
下个月可正式购买此书,我将在博客公告栏中标明购买链接,请大家耐心等待,谢谢。