重庆熊猫 Loading

Entity Framework教程-介绍 Entity Framework(Introduction to Entity Framework)

更新记录
转载请注明出处:
2022年10月10日 发布。
2022年10月5日 从笔记迁移到博客。

Entity Framework概要介绍

Entity Framework介绍(是什么)

Object/Relational Mapping (O/RM) framework

企业级ORM(对象关联映射,ORM,Object-Relational Mapping)

可以在SQL Server、Oracle、DB2、MySQL等数据库上使用

开发者可以使用LINQ查询,然后使用C#面向对象方式来操作和检索数据

目前Entity Framework有两种实现:

​ Entity Framework 6.x 基于.NET Framework,不跨平台

​ Entity Framework Core 基于.NET Core,跨平台

备注:最后都会合并成一个Entity Framework

Entity Framework特点

open-source(开源)、lightweight(轻量)、extensible(可扩展)、cross-platform(跨平台)

Entity Framework相关网址

EF Core on GitHub: https://github.com/aspnet/EntityFrameworkCore

EF Core Roadmap: https://docs.microsoft.com/en-us/ef/core/what-is-new/roadmap

Track EF Core's issues at https://github.com/aspnet/EntityFrameworkCore/issues

EF Core Official Documentation: https://docs.microsoft.com/ef/core

使用Entity Framework的好处

使用面向对象的方式开发数据库,直接将E-R概念模型转为数据库对象模型

开发效率提高,对象 映射到 数据库,操作更加方便简单

减少了直接使用ADO.NET,减少SQL操作错误

减少直接写具体SQL语句

避免程序与指定的数据库耦合过高

Entity Framework适合场景

项目数据关系、业务流程复杂; 使用EF简化数据关系,提高开发效率

将 应用 与 数据库 的耦合减少,可以跨多种数据库使用应用程序

Entity Framework不适合场景

高并发场景

EF目的是以面向对象方式来梳理业务而不是抗并发

EF处理高并发的方法:在大型项目中使用有消息队列和缓存等机制来处理并发问题,不要让一切并发都让Entity Framework来处理

Entity Framework与ADO.NET对比

直接操作SQL

ADO.NET直接操作SQL,所以一般情况下比EF更加灵活

但当数据库逐渐变大变得复杂之后,直接操作SQL将更容易出现错误

面向对象方式开发

Entity使用面向对象的思维开发数据库,而ADO.NET不是

结构不同

ADO.NET中类把SQL语句直接传送到数据库引擎进行解析,执行数据操作

image

EF中通实体数据模型映射到底仓的数据结构,开发人员只需要编写/操作实体对象

image

Entity Framework与Entity Framework Core对比

具体对比:https://docs.microsoft.com/en-us/ef/efcore-and-ef6/

相同点:

  • 基本概念相同,比如:DbContext & DbSet、Data Model、Querying using Linq-to-Entities、Change Tracking、SaveChanges、Migrations。

区别:

  • EF有DB First、Model First、Code First。EF Core不支持模型优先,推荐使用代码优先,遗留系统可以使用Scaffold-DbContext来生成代码实现类似DBFirst的效果,但是推荐用Code First。
  • EF会对实体上的标注做校验,EFCore追求轻量化,不校验。熟悉EF的话,掌握EFCore会很容易,很多用法都移植过来了。
  • EF Core又增加了很多新东西。EF中的一些类的命名空间以及一些方法的名字在EF Core中稍有不同。EF不再做新特性增加。

EF Core与其他ORM比较

Entity Framework Core(EF Core)是微软官方的ORM框架。
优点:功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异;缺点:复杂、上手门槛高、不熟悉EFCore的话可能会进坑。
Dapper.优点:简单,N分钟即可上手,行为可预期性强;缺点:生产效率低,需要处理底层数据库差异。
EF Core是模型驱动(Model-Driven)的开发思想,Dapper是数据库驱动(DataBase-Driven)的开发思想的。没有优劣,只有比较。
性能:Dapper等≠性能高;EF Core≠性能差。
EF Core是官方推荐、推进的框架,尽量屏蔽底层数据库差异,。NET开发者必须熟悉,根据的项目情况再决定用哪个。

其他ORM

EF Core、Dapper、SqlSugar、FreeSql、NHibernate

EF Core如何与数据库通信

EF Core是对于底层ADO.NET Core的封装,因此ADO.NET Core支持的数据库不一定被EF Core支持。

EF Core支持所有主流的数据库,包括MS SQL Server、Oracle、MySQL、PostgreSQL、SQLite等。可以自己实现Provider支持其他数据库。国产数据库支持问题。

对于SQLServer支持最完美,MySQL、PostgreSQL也不错(有能解决的小坑)。这三者是.NET圈中用的最多的三个。本课程主要用SQLServer讲,如果用其他数据库只要改一行代码+绕一些小坑即可,大部分代码用法不变。EF Core能尽量屏蔽底层数据库差异。

Entity Framework中的文件

.edmx EF Designer工具生成的实体数模型(EDM)文件,用于完成对象的映射

​ 注意:如果使用代码优先方式开发,则可能没有该文件

注意:.edmx目前只在EF6中存在,EF Core中没有,原因是EF Core不支持使用EDM

Entity Framework版本

image

Entity Framework Core版本

image

EF Core 处理流程概览

image

Entity Framework Core组成介绍

主要组成部件

DbContext 数据库上下文

DbContextOptions 数据库上下文配置参数

DbSet/DbQuery 实体集合

Entity 实体

Database Providers 数据库提供器

ChangeTracker 变化追踪

image

image

DbContext

DbContext是EF核心的核心,表示应用程序与数据库之间的会话(Session)

DbContext类的实例通常保存DbSet和DbQuery成员

DbContext带有ChangeTracker变化追踪器

一般情况下不直接使用DbContext,而是派生DbContext类来使用该类

映射到数据库的实体被添加为DbSet和派生类的DbQuery属性成员

DbContext 类的OnModelCreating方法用于进一步定义实体和数据库之间的映射

DbContext 类的SaveChanges方法将用于对数据库的所有更改以隐式的形式保存

DbContext常用属性

DbContext属性 说明
Database 提供对数据库相关信息和功能的访问, 包括SQL语句的执行
Model 关于实体的元数据以及之间的关系, 以及它们如何映射到数据库 注意:通常不直接使用该属性
ChangeTracker 提供对实体实例的信息和操作的访问 上下文正在跟踪
DbSet 用于查询和保存应用程序实体的实例 针对DbSet属性的集成查询(LINQ)查询是转换为SQL查询 例如:public DbSet A
DbQuery 用于使用非表源从数据库查询数据 比如:视图(View)

DbContext常用方法

DbContext方法 说明
Entry Entry 提供对更改跟踪信息和操作的访问(例如 更改实体的EntityState)。也可以调用 将状态更改为跟踪的未跟踪实体
SaveChanges SaveChangesAsync 将所有实体更改保存到数据库并返回 受影响的记录
OnConfiguring 用于创建或修改上下文选项的生成器 在每次创建DbContext实例时执行 注意:建议不使用此选项 而是使用DbContextOptions 在运行时配置上下文,并使用 设计时的IDesignTimeDbContextFactory
OnModelCreating 在模型已初始化但尚未完成之前调用 Fluent API的方法被放在这个方法中以完成模型的定义

DbContextOptions

DbContextOptions类 用于配置 派生自DbContext类的实例

并通过构造函数注入被注入到派生的DbContext类中

使用DbContextOptionsBuilder创建,因为DbContextOptions并不直接在代码中构造

ChangeTracker

ChangeTracker用于监视DbSet中的数据

增删改操作将报告给DbContext

然后执行SaveChanges以执行正确的SQL语句时

ChangeTracker定义在DbSet的EntityState属性

image

DbSet和DbQuery

DbSet和DbQuery是EF Core用来保存具体数据的 专门集合类型

是用于映射到数据库的实体的实例

DbSet用于读/写(read/write)操作,其中的实体必须有主键

DbQuery用于只读(read-only)操作

DbQuery用于查询除了表格之外的一些数据,比如:视图、存储过程

DbSet常用方法

DbSet方法 描述
Add/AddRange 添加数据/添加多条数据 实体的状态变为Added状态 调用SaveChanges时将添加项到数据库中 该方法还有异步版本
Find 通过主键查找数据 该方法还有异步版本
Update/ UpdateRange 更新数据 实体的状态变为Modified状态 调用SaveChanges时将更新项到数据库中 该方法还有异步版本
Remove/Remove 删除数据/删除多条数据 实体的状态变为Deleted状态 调用SaveChanges时将删除项到数据库中 该方法还有异步版本
Attach/ AttachRange 实体的状态设置为为Unchanged状态 调用SaveChanges时将不执行任何操作 该方法还有异步版本
FromSQLRaw 直接将SQL语句转为LINQ

Entities(实体)

Entities是 POCOs (Plain Old C# Objects),用于表示具体的数据模型和约定

实体本质就是类

EF Core中的实体是映射到数据库表的C#类

还有一些约定定义在OnModelCreating方法中

每个实体通过DbSet或DbQuery属性添加到DbContext

实体通过导航属性与其他实体相关,这些属性成为数据库模型

Entity Configuration(实体配置)可以使用三种方式:

built-in conventions (内置的默认约定)

data annotations (数据注解)

Fluent API

built-in conventions (内置的默认约定)

EF Core中内置了许多约定来定义实体和表之间的映射

约定主要基于属性名称和数据类型等情况,减少所需的手动配置量

主键约定主要匹配Id或Id属性

依靠约定是不可靠的,最好还是使用数据注解和Fluent API进行手动配置

data annotations (数据注解)

数据注解的优先级高于默认约定

常见数据注解

Data Annotation Definition
Table 定义表名映射
Column 定义列名
Key 定义主键
Required 定义必须项,不可以为null
ForeignKey 定义外键
InverseProperty 在关系的另一端声明导航属性
MaxLength 定义最大长度
TimeStamp
DatabaseGeneratedOption 计算值、标识值或无值
NotMapped 不映射
DataType 定义数据类型

Fluent API

Fluent API通过C#代码配置实体

在modelCreating的DbContext中可用的ModelBuilder方法

Fluent API是最强大的配置方法和重写。优先级高于约定和数据注解

一些配置选项只能使用Fluent API,比如复杂的键和索引

Navigation Properties and Foreign Keys(导航属性和外键)

导航属性用于关联多个模型

在数据库方面,导航属性是转换为表之间的外键关系

EF Core直接支持一对一和一对多关系

多对多的关系是如果在两个表之间使用联接实体(join entity),则受支持

在一对多关系中

在一这个方向,添加属性关联到多方即可

在多这个方式,添加属性关联到一方的主键即可

禁用变化追踪(ChangeTracker)

可以在DbSet<>类上调用AsNoTracking方法来禁用变化追踪(ChangeTracker)

this.Products.AsNoTracking();

Database Providers

EF Core使用不同的Database Providers来实现与不同的数据库一起使用

目前支持的数据提供器如下:

https://docs.microsoft.com/en-us/ef/core/providers/

Entity Framework开发风格(Development Approaches)

开发风格介绍(EF Development Approaches)

Entity Framework支持开发风格:

代码优先(Code-First)、模型优先(Model First)、数据库优先(Database-First)

Entity Framework Core支持开发风格:

代码优先(Code-First)、数据库优先(Database-First)

根据互相对应关系共有4中风格:

image

image

image

Visual Studio中的向导图:

image

代码优先(Code First)

image

代码优先说明:

从代码创建模型,再生成对应的数据库

creates the database and tables using migration based on

the conventions and configuration provided in your domain classes.

This approach is useful in Domain Driven Design (DDD)

Code First方式通过C#或者VB.NET来描述模型,然后通过类来创建数据库,这些类简称为POCO(Plain Old CLR Object)

适合使用Code First的场景(When to use the code-first approach)

新开的项目

通过代码生成数据库结构

不适合使用Code First的场景(When not to use the code-first approach)

存在遗留系统,避免数据库重写

数据库结构不可以被程序员查看

已经有其他的ORM了

模型优先(Model First)

image

模型优先:创建模型,再生成SQL到数据库中

Model First允许我们使用实体设计器在模型(扩展名为edmx)中创建模型实体及其关系和继承层次结构,然后创建数据库,这种方法也被一些开发人员所使用,对于小型且简单的项目可以考虑这种方式

数据库优先(Database First)

image

数据库优先说明:

创建数据库代码,再生成Code或者模型

creates the domain and context classes based on existing database

This has limited support in EF Core as it does not support visual designer or wizard

Database First使我们能够从现有数据库(如SQL Server、Oracle、DB2等)创建模型,此方法减少了自动生成代码所需编写的代码量,同时也限制了我们使用生成代码的结构,如果已有数据设计来开发或现有已存在的数据库,那么这种方式将作为首选

image

使用EF生成数据库 和 使用SQL代码生成数据库的区别

SQL代码生成数据库 属于 声明式数据库编程(declarative database programming)

EF生成数据库 属于 命令式数据库编程(imperative database programming)

参考资料

https://www.entityframeworktutorial.net/efcore/entity-framework-core.aspx
https://www.learnentityframeworkcore.com/
https://www.learnentityframeworkcore5.com/
https://www.entityframeworktutorial.net/
https://riptutorial.com/entity-framework-core
https://riptutorial.com/entity-framework
https://entityframework.net/
https://www.tektutorialshub.com/
https://www.tektutorialshub.com/asp-net-core-tutorial/
https://entityframeworkcore.com/articles/carloscds-ef-core-dependency-injection
https://www.yogihosting.com/read-records-entity-framework-core/
https://dotnettutorials.net/lesson/install-entity-framework-core/

posted @ 2022-10-10 10:23  重庆熊猫  阅读(1003)  评论(0编辑  收藏  举报