前言
到目前为止写过刚好两百来篇博客,看过我博客的读者应该大概知道我每一篇博客都沿袭着一贯的套路,从前言到话题最终到总结,本文依然是一如既往的套路,但是不是介绍技术,也可说是介绍技术,不过是介绍书中的技术以及我对写作的态度,作为对本书的宣传,本书在最近即将出版,到时会在博客公告栏中放出购买链接。
写作初衷
之前有过出版社的编辑找我写书,我当时看了看也没回复最终当然也就是不了了之了,最主要的是觉得自己资历尚浅,写书和写博客有很大不同,写博客在言语上可以略微随意,而写书需要的是严谨同时在表达上也应言简意赅,后来怎么又写上了呢,看了看自己写的博客当属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 章 7EntityFramework历史 71.1 EntityFramework版本介绍 71.2 EntityFramework 领域建模方式 91.2.1 Code First 91.2.2 Model First 101.2.3 Database First 101.3 使用EntityFramework Code First 6.x 或Core 2.0的原因 101.4 小结 11第 2 章 12数据库表创建和迁移 122.1 数据库连接和初始化策略 122.1.1 数据库连接 122.1.2 数据库初始化策略 152.2 约定 172.2.1 类型发现 172.2.2 主键约定 172.2.3 关系约定 192.2.4 复杂类型约定 202.2.5 自定义约定 212.3 基于代码配置(Code-based Configuration Settings) 292.4 配置属性映射和关系映射 322.4.1 属性映射 322.4.2 关系映射 502.4.3 私有化属性映射 672.5 继承映射策略 692.5.1 Table per Hierarchy (TPH) 702.5.2 Table per Type (TPT) 702.5.3 Table per Concrete class (TPC) 732.5.4 Entity Splitting 772.5.5 Table Splitting 802.6 代码迁移 822.6.1 迁移命令 822.6.2 迁移本质 91第 3 章 102实体状态和数据操作 1023.1 实体状态 1023.2 数据操作 1053.2.1 数据查询 1053.2.2 数据保存 1243.2.3 自动生成存储过程 1353.3 避免陷阱3.3.1 导航属性查询3.3.2 分页查询 3.3.3 语义可空3.3.4 表值函数3.3.5 日期操作3.4 基础篇实战 1383.4.1 复杂属性作为JSON存储数据库表列 138第二篇 153第 4 章 155上下文管理和变更追踪原理 1554.1 上下文生命周期管理 1554.1.1 基础模式追溯 1554.1.2 生命周期追溯 1574.1.3 进化模式追溯 1604.2 变更追踪原理 1634.2.1 快照式变更追踪(Snapshot based Change Tracking) 1634.2.2 代理式变更追踪(Notification based Change Tracking with Proxies) 165第 5 章 175变更追踪原理和日志管理 1755.1 DetectChanges原理 1755.1.1 DetectChanges用途 1755.1.2 调用DetectChanges方法时机 1775.1.3 关闭自动调用DetectChanges方法 1805.1.4 遗忘的二进制属性和复杂类型 1825.2 日志记录 1865.2.1 ToString打印 1865.2.2 简单日志打印 1875.2.3 结构化日志输出 1905.2.4 构造块拦截 1925.2.5 拦截器异常性能监控 1975.2.6 拦截器解决EF 6.1忽略字符串空格历史遗留问题 2115.3 事务 2155.4 连接弹性 240第 6 章 246并发冲突 2466.1 初级版解析 2466.2 中级版解析 2526.2.1 客户端获胜 2536.2.2 数据库获胜 2546.2.3 客户端和数据库合并获胜 2556.3 高级版解析 2566.3.1简单重试策略 2576.3.2 Polly重试策略 257第 7 章 262性能优化实践 2627.1 优化一:预编译视图 2627.2 优化二:减少首次与数据库交互代码 2667.3 优化三:NGen安装EntityFramework程序集 2697.4 优化四:AsNoTracking 2717.5 优化五:DbFunctions/SqlFunctions 2717.6 优化六:缓存 2767.7 优化七:重新编译查询 2827.8 优化八:避免’N+1’ Select查询 2877.9 优化九:添加索引 2897.10 优化十:关闭回调DetectChanges方法 2937.11 优化十一:使用异步查询 296第 8 章 297EntityFramework 6.x实战 2978.1 工作单元泛型仓储模式(Generic Repository and a Unit of Work) 2978.2 依赖注入泛型仓储模式(Generic Repository Pattern and Dependency Injection) 321第三篇 338第 9 章 340数据库表创建和迁移 3409.1 数据库初始化策略 3409.2 配置属性映射和关系映射 3449.2.1 属性映射 3459.2.2 Backing Fields 3579.2.3 Alternate Keys 3629.2.4. Shadow Property 3639.2.5 Owned Entities 3689.2.6 HasQueryFilter 3699.2.7 关系映射 3719.2.8 继承映射 3939.3 代码迁移 3989.3.1 控制台程序迁移 3989.3.2 Web应用程序迁移 4009.3.3 多个上下文迁移 4139.3.4 脚手架逆向迁移 417第 10 章 422数据操作和初始化数据 42210.1 实体状态 42210.2 数据操作 42310.2.1 数据查询 42310.2.2 数据保存 44610.3 无连接实体 45210.4 初始化数据 455第四篇 459第 11 章 461性能优化实践 46111.1 AsNoTracking 46111.2 EF.Functions.Like 46311.3 自定义标量函数 46611.4 显式编译查询 47011.5 上下文实例池 473第 12 章 479查询实体元数据和模型数据验证 47912.1 查询元数据 47912.2 内置模型验证 48112.3 第三方扩展模型验证 484第 13 章 488上下文实例创建方式 48813.1 显式创建上下文实例 48813.1.1 带有构造函数的OnConfiguring方法 48813.1.2 传递连接字符串参数到构造函数 48913.1.3 使用不带依赖注入的DbContextOptions 48913.2 依赖注入容器创建上下文实例 49013.2.1 带有无参构造函数的DI 49013.2.2 带DbContextOptions的DI 49113.3.3 使用泛型DbContextOptions 49113.3.4 使用AddDbContext/AddDbContextPool 492第 14 章 494实现多租户 494第 15 章 504捕获审计数据 504第 16 章 510变更追踪策略和日志管理 51016.1 变更追踪策略 51016.1.1 INotifyPropertyChanged 51116.1.2 INotifyPropertyChanging 51416.2 日志管理 51616.2.1 添加控制台包输出 51616.2.2 自定义日志输出 517第 17 章 521xUnit单元测试 52117.1 控制台单元测试 52217.2 NET Core Web应用程序单元测试 524第 18 章 527事务和并发冲突 52718.1 事务 52718.2 并发冲突 53318.2.1 初级版解析 53418.2.2 中级版解析 53818.2.3 高级版解析 543第 19 章 550EntityFramework Core 2.1待发布 55019.1 新特性实现目标 550总结
本书是我所理解的EF 6.x和EF Core 2.0,也有我个人的一些思考,若本书能够对您有所帮助,那么如我写博客一样成就感就在于此了,期待本书能够得到您的认可,我会一如既往和大家分享我所得。
购买通知
下个月可正式购买此书,我将在博客公告栏中标明购买链接,请大家耐心等待,谢谢。