EF框架(Entity Framework)
EF概念
Entity Framework (EF) 是一个对象关系映射(Object-Relational Mapping,简称ORM)框架,它允许开发者使用面向对象的方式来处理数据库操作。EF 可以自动将数据库中的表映射为应用程序中的对象,这样开发者就可以使用这些对象来进行数据库操作,而不需要编写大量的 SQL 代码。
EF 的主要组成部分:
-
Entity Data Model (EDM):
- EDM 是 Entity Framework 的核心,它定义了应用程序的数据模型。
- 它包括三个主要部分:概念模型(CSDL)、存储模型(SSDL)和映射模型(MSL)。
-
概念模型 (CSDL):
- 概念模型定义了应用程序中使用的实体和关系。
- 它是一个抽象层,独立于数据库的具体实现。
-
存储模型 (SSDL):
- 存储模型定义了数据库的结构,包括表、列、关系等。
- 它与数据库的物理结构紧密相关。
-
映射模型 (MSL):
- 映射模型定义了概念模型和存储模型之间的映射关系。
- 它指定了概念模型中的实体如何映射到存储模型中的表。
Entity Framework 的一些核心概念:
-
DbContext:
- DbContext 是 EF 的核心,它表示数据库会话,用于查询和保存数据。
- 它包含 DbSet 属性,每个属性代表数据库中的一个表。
-
DbSet:
- DbSet 是 DbContext 的一个属性,代表数据库中的一个表。
- 它提供了 LINQ 方法,用于查询和操作数据库中的数据。
-
Entity:
- Entity 是数据库表中的一行数据,它是一个对象,与数据库表的列相对应。
- 在 EF 中,实体类通常通过继承 DbContext 中的 DbSet 来定义。
-
Entity Set:
- Entity Set 是一组具有相同类型的实体对象。
- 在数据库中,它通常对应于一个表。
-
Model:
- Model 是数据库的抽象表示,它定义了实体和它们之间的关系。
- EF 使用 Code First、Database First 或 Model First 来创建模型。
-
Code First:
- Code First 是一种开发模式,开发者首先编写实体类,然后 EF 根据这些类生成数据库。
- 它允许开发者使用纯 C# 代码来定义模型。
-
Database First:
- Database First 是一种开发模式,开发者首先创建数据库和表,然后 EF 根据数据库生成实体类和 DbContext。
-
Migrations:
- Migrations 是 EF 的一个特性,它允许开发者跟踪模型的变更,并应用这些变更到数据库。
- 它通过迁移脚本来管理数据库的版本。
-
Connection String:
- Connection String 是一个字符串,包含了连接数据库所需的所有信息,如数据库服务器地址、数据库名、认证信息等。
-
Repository Pattern:
- Repository Pattern 是一种设计模式,它定义了访问数据的方法,而不需要暴露数据访问的实现细节。
- 在使用 EF 时,Repository Pattern 可以帮助开发者更好地组织代码,提高代码的可维护性和可测试性。
-
LINQ to Entities:
- LINQ to Entities 是 EF 提供的一种查询语言,它允许开发者使用 LINQ 语法来查询数据库。
-
Change Tracking:
- EF 通过 DbContext 跟踪实体的状态,包括新增、修改和删除。
- 这使得开发者可以轻松地保存更改到数据库。
-
Lazy Loading 和 Eager Loading:
- Lazy Loading 是一种延迟加载策略,只有在需要时才加载相关数据。
- Eager Loading 是一种预加载策略,它会在加载实体时同时加载相关数据。
常用的
- DbContext:这是EF的上下文,它封装了对数据库的操作,如查询、插入、更新和删除。
- DbSet:这是DbContext中的一个属性,代表数据库中的一个表。
- Entity:代表数据库中的一行数据,是一个对象。
- EntitySet:代表一组具有相同类型的实体对象。
- LINQ to Entities:这是一种查询语言,允许开发者使用LINQ语法来查询数据库。
- Entity SQL:这是另一种查询语言,类似于LINQ to Entities,但更复杂。
- Object Services:负责数据的具体化,即将客户端实体数据转换为数据库记录,以及反之。
- Entity Client Data Provider:将LINQ to Entities或Entity SQL转换为数据库可以识别的SQL查询语句。
- ADO.NET Data Provider:使用标准的ADO.NET与数据库通信。
EF的架构包括实体数据模型(EDM),它由概念模型、存储模型和映射模型组成。概念模型定义了模型类和它们之间的关系,存储模型是数据库设计模型,包括表、视图、存储过程等,映射模型包含有关如何将概念模型映射到存储模型的信息。
在使用EF时,开发者可以通过配置文件(.config)中的连接字符串来配置数据库连接,并且可以通过T4模板生成context类和实体类。Entity类通常是POCO(Plain Old CLR Object)类,它们是简单的.NET对象,不依赖于任何特定的框架。
EF还支持多种实体类型,包括POCO实体和动态代理(POCO Proxy),后者允许延迟加载和自动跟踪更改。
EF的生命周期管理包括跟踪实体的状态,如新增、已删除、已修改、未更改和分离。这些状态帮助EF确定何时需要对数据库执行插入、更新或删除操作。
EF Core是Entity Framework的跨平台、轻量级版本,它支持多种数据库引擎,并且具有良好的可扩展性和性能优化功能。EF Core通过约定大于配置的原则,提供了一种简化的模型配置方式,同时也支持Fluent API和数据注解来自定义模型配置。
EF Core支持数据库迁移,这是一种根据实体类的变化自动更新数据库结构的过程。开发者可以使用EF Core的CLI命令来生成迁移脚本并更新数据库。
总的来说,Entity Framework和EF Core为.NET开发者提供了强大的工具来简化数据库操作,使他们能够更专注于业务逻辑而不是数据库细节。
ORM(Object-Relational Mapping)
ORM概念
ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于在关系数据库和对象程序语言之间转换数据。ORM 允许开发者使用面向对象的方式来操作数据库,而不必编写复杂的 SQL 语句。这样做的好处是提高了代码的可读性和可维护性,同时也减少了数据库访问代码的冗余。
C#中流行的ORM框架:
-
Entity Framework (EF):
- Entity Framework 是由微软开发的 ORM 框架,支持 .NET 应用程序。它提供了 Code First、Database First 和 Model First 开发模式。
- EF 通过 DbContext 和 DbSet 提供了对数据库的操作接口,支持 LINQ 查询,使得数据访问更加直观和方便。
-
NHibernate:
- NHibernate 是一个成熟的、功能丰富的 ORM 框架,它基于 Java 的 Hibernate 框架。NHibernate 支持复杂的映射策略和缓存机制,适用于需要高度可定制化数据访问层的企业级应用。
-
Dapper:
- Dapper 是一个轻量级的 ORM 工具,它是一个小巧的数据库映射框架,用于.NET平台。Dapper 通过扩展 IDbConnection 对象,提供了高效的 SQL 执行和映射能力。
- 它特别适合需要高性能和细粒度控制的场景。
-
Entity Framework Core:
- Entity Framework Core 是 Entity Framework 的跨平台版本,支持 .NET Core 和 .NET 5/6/7 等。它是一个轻量级的、可扩展的框架,适用于构建现代的云原生和移动应用。
-
LLBLGen Pro:
- LLBLGen Pro 是一个全功能的 ORM 框架,提供了强大的数据访问和数据建模功能。它支持复杂的查询、事务管理、缓存和数据验证。
ORM的主要功能:
- 对象映射:将数据库表映射为类,表的行映射为对象实例。
- 数据查询:使用对象和集合的方式查询数据库,而不是编写 SQL 语句。
- 数据持久化:将对象的状态保存到数据库中,包括插入、更新和删除操作。
- 延迟加载:按需加载关联对象的数据,以优化性能。
- 事务管理:简化数据库事务的处理。
使用ORM的好处:
- 提高生产力:开发者可以专注于业务逻辑,而不是数据库操作细节。
- 减少错误:减少手动编写 SQL 带来的错误。
- 代码可维护性:使用面向对象的方式组织代码,提高代码的可读性和可维护性。
- 数据库无关性:代码通常不依赖于特定的数据库系统,提高了代码的可移植性。
ORM 的一些关键概念:
-
实体(Entity):
- 实体是现实世界中的对象在计算机程序中的表示,通常对应数据库中的一行记录。
-
属性(Attribute):
- 实体的属性对应数据库表中的列,存储了实体的具体数据。
-
关系(Relationship):
- 对象之间的关系,如父子关系、关联关系等,在数据库中通常通过外键来实现。
-
导航属性(Navigation Property):
- 导航属性允许开发者在对象之间导航,而不需要直接操作数据库。
-
数据映射(Mapping):
- 数据映射是指定义对象模型和数据库模型之间的对应关系,包括实体如何映射到表,属性如何映射到列,以及关系如何映射到外键。
-
数据持久化(Persistence):
- 数据持久化是指将内存中的对象状态保存到数据库中,以便持久存储。
-
延迟加载(Lazy Loading):
- 延迟加载是一种策略,只有在需要时才从数据库加载相关对象的数据。
-
立即加载(Eager Loading):
- 与延迟加载相反,立即加载是在查询时就加载所有相关对象的数据。
-
级联操作(Cascading):
- 级联操作是指在对一个对象进行操作(如插入、更新、删除)时,相关联的对象也会自动进行相应的操作。
-
存储过程(Stored Procedure):
- 存储过程是一组为了完成特定功能的 SQL 语句集,它存储在数据库中,可以通过 ORM 调用。
-
事务(Transaction):
- 事务是一组原子性的数据库操作,要么全部成功,要么全部失败。
-
配置(Configuration):
- ORM 框架通常允许通过配置文件或代码来配置实体和数据库的映射关系。
-
迁移(Migrations):
- 迁移是 ORM 框架中用于跟踪和应用数据库模式变更的过程。
-
模型(Model):
- 在 ORM 中,模型是指应用程序中的对象模型,它定义了应用程序的数据结构。
ORM 框架的例子包括 Entity Framework (EF)、Hibernate、Django ORM、Sequelize 等。这些框架提供了不同的功能和特性,以适应不同的开发需求和场景。使用 ORM 可以提高开发效率,减少错误,并且使代码更加易于维护和理解。