Entity Framework是 ORM
ORM 对象关系映射(object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说.ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中.
O:Domain Object 领域模型
R:Relational Database 关系型数据库
M: Mapping 映射关系
EF CRUD操作:
- 定义模型:这是EF工作的前提,定义模型包括定义领域类(Domain Class),派生自DbContext的上下类和Configuration(如果有的话).EF将通过模型执行CRUD操作.
- 添加数据:将领域对象添加到上下文并调用SaveChanges()方法,EF API将构建适当的INSERT命令并将其执行到数据库
- 读取数据:执行LINQ-to-Entities查询,EF API会将此查询转换为底层关系数据库的SQL查询并执行,然后将结果转换为实体对象并显示在UI上.
- 编辑或删除数据: 从上下文更新或删除实体对象并调用该SaveChanges()方法.EF API将构建适当的UPDATE或DELETE命令并执行;
EF API(EF6和EF Core)包括几个功能:1.将领域类映射到数据库,2.将LINQ查询转换为SQL并执行,3跟踪实体在其生命周期内发生的更改,并将这些更改保存到数据库.
EDM 实体数据模型(Entity Data Model)
EDM是一个可时化的工具,用来生成 O,R,M
EF API的首要任务是构建实体数据模型(EDM).EDM是整个元数据的内存表示,包含:概念模型,存储模型以及它们之间的映射
概念模型:EF通过领域类,上下文类,默认约定和配置构建概念模型
存储模型:EF为底层数据库架构构建存储模型.在代码优先方法中,根据概念模型进行推断来构建.在数据库优先模式中,根据目标数据库进行推断来构建
映射:EF包括映射信息,表示概念模型是如何映射到数据库架构(存储模型)
EF的三种模式:DBFirst(教的那种),ModelFirst,CodeFirst
- DBFirst
db放在第一位,在我们开发之前必须要有完整的database,实际开发中用到最多。。。
- model First...
mode 放在第一位,
根据model生成数据库,和我们的sqlserver的可视化类视图是一样的...
其实sqlserver也有自己的类视图。。。
<1>生成类图
<2>根据模型生成数据库
- code First
DDD领域
先code我们的domain entity 然后根据这些domain entity 来生成我们的db...
EntityFramework.dll
<1>两种语法查询db: Linq to Entity Entity SQL
<2>ObjectServices: 在linq to Entity和Entity client起到相互转换的作用...
<3>Entity client Data Provider: Lambda转化为具体的sql.....(SqlProvierService)=>EntityFramework.SqlServer所包含的...
<4>ADO.net Data Provider:最简单的一个ADO.Net
<5>DataBase:数据库
Entity Framework就是让我们忘记数据库。。。忘记Sql。。。
优点:开发效率。。。
缺点:执行效率相对较低.我们无法控制DataProvider给我们生成的Sql...
新建一个entity framework。。。
1.通过nuget自己来下载一个entity framework。。。。
domain和db是怎么操作。。。
DbSet(Student) 集合 [用于存放集合] 从名称中可以看出,是一个叫做Student Set的一个集合 可以出是一个叫实体的仓库
SaveChanges() 模式提交,会从仓储中获取添加的domain ontity,然后整体性的提交数据库。。。
执行操作之前,会开启一个transaction... 两条insort之后, commit transction
DBSet => Ropsitory 仓储
DbContext =>unitofworf 工作单元
DbContext(上下文类)
在DbFirst模式中,我们添加一个EDM(Entity Data Model)后会自动生成一个.edmx文件,这个文件中包含一个继承DbContext类的上下文实例,DbContext是实体类和数据库之间的桥梁,DbContext主要负责与数据交互,主要作用:
- DbContext包含所有的实体映射到数据库表的实体集(DbSet<TEntity>)
- DbContext将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库
- 更改跟踪:它跟踪每个实体从数据库中查询出来后发生的修改变化.
- 持久化数据:它也基于实体状态执行插入,更新和删除操作到数据库中.
DbContext中的Dbset
Dbset表示上下文中给定类型的所有实体的集合或可从数据库中查询的给定类型的所有
实体的集合.可以使用DbContext.Set方法从DbContext中创建DbSet对象,DbSet对应着数据库中的表,DbSet常用的方法如下
Add(Entity)/AddRange | 返回添加的Entity | 添加实体到context中,并给实体标记Added状态dbcontext.Students.Add(studentEntity) |
AsNoTracking<Entity> | DBQuery<Entity> | 获取一个不被context缓冲和追踪的序列,多用于获取只读序列 var studentList=dbcontext.Students.AsNoTracking<Student>().ToList<Student>(); |
Attach(Entity) | 返回添加的Entity | 将实体添加到context上下文中 dbcontext.Students.Attach(studentEntity); |
Find(int) | 返回对应Id的Entity | 通过主键获取实体对象,如果在数据库和context中不存在那么返回null,注:也会返回context中存在但还没有写入数据库的实体对象 Student studEntity=dbcontext.Students.Find(1); |
Include | DBQuery | Include必须是外键连接,且立即执行;join连接不需要外键,延时执行 var studentList=dbcontext.Students.Include(“StudentAddress”).ToList<Student>() var studentList=dbcontext.Students.Include(s=>s.StudentAddress).ToList<Student>(); |
Remove/RemoveRange | 返回删除的entity | 删除实例,并给对象添加deleted标记.dbcontext.Students.Remove(studentEntity); |
SqlQuery | DBSqlQuery | 通过sql获取实例对象集合,默认情况下,返回的集合将被跟踪,可以使用AsNoTracking()取消跟踪. var studentEntity=dbcontext.Students.SqlQuery(“select*from student where studentid =1”).FirstOrDefault<Student>(); |
DbContext中DBEntityEntry
在EF中实体的五种状态
- detached:实体不在上下文的追踪范围内.如new的实例处于detached,可以通过Attach()添加到上下文,此时的状态是unchanged.
- Unchanged:未改变,如刚从数据库读出来的实例
- added:添加状态 一般执行
- deleted:删除状态 一般执行db.Set<T>.Remove(t)/RemoveRange(ts)时标记为deleted,数据库中必须先有了相应的记录,所有deleted不能转为added状态.
- modified:修改状态改变了实体的属性处于这个状态,可以转为deleted,不能转为added状态.