产品特色
编辑推荐
Entity Framework 是微软 .NET 平台支持的对象关联映射技术,如今已发展得相当成熟,能够轻松支持大型系统开发,开发人员可以通过实体数据模型对象与数据库进行沟通,建立更坚固的商业应用程序系统,避免因为通过 ADO.NET
直接处理 SQL 语句伴随的风险与可能产生的错误。
《Entity Framework 实用精要》带领读者进入 Entity Framework 的世界,建立必要的技术能力,同时希望读者在完成书本的学习之后,能够更进一步地将其运用在实际项目开发中。
内容简介
Entity Framework 是微软公司 .NET 平台支持的对象关联映射技术,开发人员可以通过实体数据模型对象与数据库进行沟通,建立更坚固的商业应用程序系统,避免因为通过 ADO.NET 直接处理 SQL 语句而带来的风险与可能引发的错误。本书通过介绍Entity Framework与 LINQ 开发实战的案例,以 Entity Framework 技术内容的讨论为主线,结合关键的 LINQ技巧说明,提供读者系统性学习 Entity Framework 所需的内容。
《Entity Framework 实用精要》旨在帮助读者进入 Entity Framework的世界,建立必要的技术能力,同时希望读者在完成本书的教学课程之后,能够更进一步地将其运用在实际的项目开发中。
作者简介
吕高旭,台湾康廷数字创始人, 专注程序语言与各种应用开发方法的教学,包括实体纸本图书出版与在线课程服务。
目录
第1章 Entity Framework概观 1
1.1 初探Entity Framework 1
1.2 Entity Framework与ADO.NET 9
1.3 对象关联映射——ORM 13
1.4 Entity Framework开发流程 14
1.5 空EF设计器模型 16
1.6 使用Code First 27
1.6.1 来自数据库的Code First 27
1.6.2 空Code First模型 31
1.7 小结 34
第2章 实体数据模型 35
2.1 实体数据模型概观 35
2.2 模型工具与.edmx文件 36
2.2.1 概念模型 39
2.2.2 存储模型 42
2.2.3 映射 42
2.3 实体数据模型与类文件 44
2.4 POCO与实体数据模型 46
2.5 实体类结构映射 53
2.5.1 数据注解属性 54
2.5.2 Fluent API 61
2.6 EF Designer数据库更新 65
2.7 Code First数据库迁移 71
2.7.1 结构变动迁移 76
2.7.2 查看SQL 78
2.7.3 指定迁移 79
2.8 关于DbContext 79
2.8.1 传送SQL语句与数据转换 80
2.8.2 查询与连接议题 81
2.8.3 管理更新操作 82
2.8.4 DbContext对象生命期 83
2.8.5 覆写OnModelCreating方法 83
2.8.6 管理与操作数据库——Database属性 83
2.8.7 ObjectContext 85
2.9 DbSet 87
2.10 追踪本地数据集 91
2.11 小结 94
第3章 实体数据模型与LINQ 95
3.1 LINQ与Entity Framework 95
3.2 Select——选择与投影 99
3.2.1 类型转换 100
3.2.2 多重from与SelectMany 103
3.3 Where与数据筛选 107
3.4 排序 113
3.5 分组 116
3.6 转换 122
3.6.1 AsEnumerable 122
3.6.2 Array与List 125
3.6.3 ToDictionary 128
3.6.4 ToLookup 131
3.7 异步查询 134
3.8 关联——Join 136
3.8.1 GroupJoin 139
3.8.2 Inner join与Left Outer Join 141
3.8.3 Entity Framework与Join 142
3.9 LINQ、SQL与Entity SQL 146
3.9.1 关于SQL语句 147
3.9.2 Entity SQL 147
3.9.3 Entity SQL参数 149
3.10 小结 150
第4章 Entity Framework与扩充方法 151
4.1 Enumerable扩充方法 151
4.2 聚合运算 152
4.2.1 计算平均值 153
4.2.2 Average方法与Func 155
4.2.3 聚合函数 158
4.3 设置操作 160
4.4 产生操作 164
4.4.1 Empty与DefaultIfEmpty 164
4.4.2 Range 166
4.4.3 Repeat 167
4.5 计数运算 169
4.5.1 All 169
4.5.2 Any 171
4.5.3 Contains 172
4.6 分割运算 173
4.6.1 Skip与SkipWhile 174
4.6.2 Take与TakeWhile 176
4.7 元素操作 178
4.7.1 First与FirstOrDefault 178
4.7.2 Last与LastOrDefault 180
4.7.3 ElementAt与ElementAtOrDefault 182
4.7.4 Single与SingleOrDefault 183
4.8 扩展方法的异步版本 185
4.9 小结 186
第5章 数据关联与继承 187
5.1 与关联数据互动 187
5.2 Code Frist与关联设计 194
5.2.1 Code First关联设置惯例 196
5.2.2 数据注解 200
5.3 处理特定关联定义 203
5.3.1 一对一(1 to 0..1) 203
5.3.2 多对多(* to *) 208
5.3.3 多对多关联——附加数据字段 213
5.4 使用CodeFirst设计关联 216
5.5 Lazy Loading与Eager Loading 223
5.5.1 调整virtual属性 229
5.5.2 Include方法与对象加载 231
5.5.3 Include方法与异步数据加载 234
5.6 继承 235
5.6.1 Table Per Hierarchy(TPH) 235
5.6.2 Table Per Type(TPT) 241
5.6.3 Table Per Concrete Class(TPC) 244
5.7 复杂类型 248
5.8 小结 251
第6章 数据编辑与维护 252
6.1 数据编辑操作 252
6.1.1 实体数据对象状态 255
6.1.2 更新与删除 256
6.1.3 Attach 259
6.1.4 变更追踪——DbContext.ChangeTracker 263
6.1.5 更新验证异常——DbEntityValidationException 268
6.1.6 DbContext.ValidateEntity方法 271
6.1.7 覆写SaveChange 272
6.1.8 异步的变更更新 274
6.2 SQL语句 275
6.2.1 使用参数 279
6.2.2 执行非查询变更指令——ExecuteSqlCommand 280
6.3 存储过程 281
6.3.1 直接调用存储过程 288
6.3.2 获取返回值 289
6.3.3 CodeFirst自动设置存储过程 290
6.4 数据变更冲突 294
6.4.1 并发冲突处理——Database Wins或Client Wins 298
6.4.2 SQL语句与数据冲突 300
6.4.3 存储过程与数据冲突 300
6.4.4 ConcurrencyCheck注解 302
6.5 事务处理 304
6.5.1 共享事务处理连接 305
6.5.2 使用TransactionScope 305
6.6 复杂类型的数据对象变更 308
6.7 小结 310
第7章 ASP.NET整合应用 311
7.1 Web Forms与Entity Framework 311
7.1.1 查询 314
7.1.2 更新 315
7.1.3 删除 316
7.1.4 处理单项数据 316
7.1.5 关联设计 319
7.2 MVC与Entity Framework 321
7.2.1 查询 325
7.2.2 更新/删除 326
7.2.3 添加 330
7.2.4 关系型数据 332
7.3 WCF服务与实体数据模型 335
7.3.1 WCF应用程序项目 335
7.3.2 数据合约 339
7.3.3 整合Entity Framework 340
7.4 小结 346
前言/序言
前 言
程序设计师编写网页商业应用程序时离不开对数据库的运用,基本可以认为,不懂得运用数据库的网页应用程序设计师只是完成了网页美工设计师“委托的”工作。因为几乎所有的商业化网页用程序都要在后台连接与访问数据库。
然而,没有面向对象的自动化工具,程序设计模型和数据库集成在一起就会让程序逻辑和数据模型杂乱无章地混合在一起,不但开发大型网页商业应用软件无望,就连小型的网页应用程序也没有扩展的能力,将来维护起来更是可以用“一塌糊涂”来形容。
微软公司在它的ADO.NET这个数据库访问利器的基础上融入了对象关系映射(Object-Relational Mapping)的技术,再加上一个设计的工具(Designer),就构成了现在的 ADO.NET Entity Framework,就是以实体数据模型为主,通过Entity Framework Designer(EF设计器),利用抽象化数据结构的方式,将每个数据库对象转化为应用程序实体(或对象),让数据库的E/R模型(实体-关联模型)也就转换为对象模型。这样,让程序设计师能运用自己最熟悉的面向对象的程序设计语言来轻松自如且安全可靠地调用和访问数据库,让大型网页商业应用软件的开发也不是难事。
Entity Framework 是微软 .NET 平台支持的对象关联映射技术,开发人员可以通过实体数据模型对象与数据库进行沟通,建立更坚固的商业应用程序系统,避免因为通过 ADO.NET 直接处理 SQL 语句伴随的风险与可能产生的错误。
从传统的 ADO、ADO.NET 到现在的 Entity Framework,善用新技术让我们在新时代走得更稳,本书主要的目标,除了带领读者进入 Entity Framework 的世界,建立必要的技术能力,同时希望读者在完成书本的学习之后,能够更进一步地将其运用在实际项目开发中。
本书为了方便读者自学或者学校教学,所有的范例程序都是在微软公司提供的免费版Visual Studio Community 2017中用C# 语言为主体编写完成的,所有范例程序都经过了调试和测试,可以顺利运行。
微软的Visual Studio Community 2017可以从微软公司的官方网站下载,网址如下:
https://www.visualstudio.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community&rel;=15
本书的所有范例程序源码及其运行必需的文件,读者都可以从下面的网址下载压缩的文件包,之后解压缩到自己的Visual Studio项目文件夹中即可。
这里提供下载范例程序的网址:
http://pan.baidu.com/s/1cuEVUm(注意区分数字和英文字母大小写)
如果下载有问题,请发送电子邮件至booksaga@126.com,邮件主题设置为“求Entity Framework实用精要下载资源”。
最后做一点说明:我们在编写这些范例程序的时候,为了适用性,大多数范例程序都选择连接的是Visual Studio Community 2017集成开发环境中自带的虚拟数据库(LocalDb)MSSQLLocalDB,因此范例程序对数据库的操作都是对加载到内存中的这个虚拟数据库进行增、删、改等操作,范例程序运行时可以反映出这种变化,但是不会实际修改范例程序运行时载入的实际数据库文件。如果读者要把范例程序拓展到对实际数据库的操作,那么在需要时按照实际应用建立本地或者网络远端的实际数据库,并提供访问的服务即可。
编者
2017年9月
《现代数据驱动应用开发:从容驾驭数据复杂性》 在这个数据爆炸的时代,构建高效、稳定且易于维护的数据驱动应用程序,是每一位软件工程师面临的核心挑战。无论是精美的 Web 应用、强大的后端服务,还是智能化的桌面程序,其背后都离不开对数据的精妙处理。然而,随着项目规模的增长和业务逻辑的复杂化,直接操作数据库的传统方式往往会暴露出诸多问题:代码冗余、可维护性差、性能瓶颈频现,甚至难以应对不断变化的需求。 《现代数据驱动应用开发:从容驾驭数据复杂性》正是在这样的背景下诞生的。这本书并非旨在介绍某一款特定的 ORM 工具,而是着眼于数据访问层设计和实现的核心思想与实践,帮助开发者构建出更具健壮性、可扩展性和可维护性的数据驱动应用。我们相信,理解底层原理,掌握普适性的设计模式,才能在瞬息万变的开发环境中游刃有余。 本书的独特视角与价值: 许多关于数据访问的图书往往会聚焦于某种特定技术的学习,例如某个 ORM 框架的 API 使用、SQL 语句的优化技巧,或是数据库本身的管理。这些技术固然重要,但若缺乏对宏观设计和底层原理的深入理解,开发者很容易陷入“只见树木,不见森林”的困境。我们则采取了更加“以终为始”的策略,从最终目标——构建高质量的数据驱动应用——出发,反推并梳理出实现这一目标所必需的关键知识体系。 本书不纠结于某个特定框架的语法细节,而是深入探讨: 数据模型的设计哲学: 如何根据业务需求,设计出清晰、一致且能够有效映射现实世界对象的数据模型?我们将探讨不同的建模方法,分析其优缺点,并提供实用的指导原则,帮助您避免常见的模型设计陷阱。这包括对实体、值对象、聚合根等领域驱动设计(DDD)核心概念的深入剖析,以及如何将它们转化为数据库的表结构。 数据访问策略与模式: 除了简单的 CRUD(创建、读取、更新、删除)操作,还有哪些更高级、更灵活的数据访问模式能够应对复杂的业务场景?本书将详细介绍诸如仓储模式(Repository Pattern)、单元 of Work 模式(Unit of Work Pattern)、CQRS(命令查询职责分离)等经典设计模式,并结合实际案例,演示如何运用它们来解耦数据访问逻辑,提高代码的可测试性和可维护性。 对象关系映射(ORM)的本质与权衡: ORM 工具极大地简化了数据库操作,但其内部机制和潜在的性能问题并非总被开发者充分理解。本书将深入浅出地剖析 ORM 的工作原理,解释其如何进行对象与数据库表之间的映射,以及它可能带来的性能开销(如 N+1 查询问题、延迟加载的陷阱等)。在理解原理的基础上,我们还将指导读者如何根据具体场景,选择合适的 ORM 配置和使用方式,或者在必要时,如何绕过 ORM,直接编写高效的 SQL 查询,实现性能的最优化。 数据访问层的架构设计: 如何组织和划分数据访问代码,使其易于理解、扩展和复用?本书将提供关于如何构建清晰、模块化数据访问层架构的建议,包括如何分离数据访问逻辑与业务逻辑,如何进行单元测试和集成测试,以及如何为未来的重构和技术升级做好准备。 并发控制与数据一致性: 在多用户、高并发的环境下,如何确保数据的一致性和完整性是一个严峻的挑战。本书将探讨常见的并发控制技术,如悲观锁、乐观锁,以及事务管理的重要性。我们将分析不同场景下的数据一致性需求,并提供相应的解决方案,帮助您构建出能够应对高并发挑战的健壮系统。 性能优化与调优: 即使模型设计良好,代码逻辑清晰,糟糕的数据库交互也可能导致应用性能低下。本书将提供一套系统的性能分析和优化方法,从数据库查询的执行计划分析,到索引的合理使用,再到缓存策略的运用,帮助您找到并解决性能瓶颈,提升应用的响应速度和用户体验。 数据迁移与版本控制: 随着业务的发展,数据库结构往往需要不断演进。如何安全、高效地管理数据库的变更,并确保数据在不同版本之间的一致性?本书将介绍数据迁移的理念和常用工具,帮助您建立起一套可靠的数据库版本控制和迁移流程。 本书适合谁? 初级到中级软件开发者: 希望系统性学习数据访问层设计和实现,摆脱对某个特定 ORM 框架的“黑盒”依赖,构建更优质的数据驱动应用。 有经验的软件架构师: 寻求更深入地理解数据访问的原理和最佳实践,为团队制定数据访问层技术选型和架构规范。 需要提升应用性能和可维护性的团队: 正在经历数据库性能瓶颈,或数据访问代码变得难以维护的团队,需要一套行之有效的改进方案。 对底层原理有探究精神的开发者: 不满足于表面 API 的调用,渴望理解 ORM 如何工作,数据库是如何交互的,从而更精准地掌控开发过程。 本书的承诺: 我们承诺,《现代数据驱动应用开发:从容驾驭数据复杂性》将为您提供一套通用、实用且具有前瞻性的数据访问开发指南。本书将以清晰的逻辑、丰富的案例和深入的解析,帮助您: 构建出更加健壮和可维护的数据访问层。 有效避免常见的性能陷阱,提升应用响应速度。 更从容地应对复杂业务场景下的数据处理需求。 培养独立思考和解决数据访问相关问题的能力。 为构建现代化、可扩展的软件系统奠定坚实的基础。 我们将带领您一起,深入探寻数据驱动应用的本质,掌握驾驭数据复杂性的艺术。抛开对特定工具的片面依赖,聚焦核心原则,让您的数据驱动开发能力实现质的飞跃。