ADO.NET Entity Framework实体框架

Entity Framework框架

一、EF实体框架是一个对象关系映射器(O / RM),它使.NET开发人员能够使用.NET对象处理数据库。它消除了开发人员通常需要编写的大多数数据访问代码。
二、 Microsoft提供了“Entity Framework”框架,用于自动地执行所有与数据库相关的活动。EF是一个适用于.NET开发的开源ORM框架。
三、Entity Framework是ADO.NET中一组支持面向数据的开发应用程序的技术,基于Ado.Net,是微软的一个ORM框架。
四、EF它使开发人员能够通过领域对象来处理数据,而无需关注存储此数据的基础数据库;它保存实体属性中的数据到数据库,也可以从数据库中检索数据并自动将其转换为实体对象。
五、ORM核心思想:表与表实体的相互转换。


总结EF的特性

1.跨平台   EF Core是一个跨平台的框架,可以在Windows,Linux和Mac上运行。
2.建模     EF可以创建具有不同数据类型get / set属性的EDM(Entity Data Model/实体数据模型)。它使用此模型查询或保存底层数据库的数据。
3.查询     EF允许我们使用LINQ从底层数据库中检索数据,同时也支持直接对数据库执行原始SQL查询。
4.更改跟踪  EF会跟踪需要提交到数据库的实体实例(属性值)发生的更改。
5.保存     EF调用SaveChanges()方法时,根据实体发生的更改,对数据库执行INSERT,UPDATE和DELETE命令。EF还提供了异步的SaveChangesAsync()方法。
6.并发     默认情况下,从数据是从数据库中提取开始,EF使用乐观并发来避免我们做的修改被其他用户覆盖。
7.事务     EF在查询或保存数据时自动执行事务管理。它还提供自定义事务管理的选项。
8.缓存     EF包括开箱即用的第一级缓存。因此,重复查询将从缓存中返回数据,而不是访问数据库。
9.配置     EF允许我们使用注释属性配置EF模型,也可以使用Fluent API来覆盖默认约定。
10.迁移    EF提供了一组迁移命令,我们可以在NuGet Package Manager控制台或命令行界面中执行这些命令来创建或管理底层数据库计划。

在这里插入图片描述

EF总体架构:
在这里插入图片描述

架构中的组件

EDM(Entity Data Model):EDM由概念模型,映射和存储模型三部分构成(见上文)。

Linq to Entities:L2E是一个针对对象模型编写的查询语言,它返回定义在概念模型中的实体。

Entity SQL:Entity SQL是以一种查询语言有点像L2E,但是只能运行在EF6中。相对于L2E,Entity SQL稍难,而且需要开发者单独学习。

Object Service:Object Service是访问数据库的主要入口点。它负责将下一层返回的数据转换为实体对象的结构。

Entity Client Data Provider:这一次主要负责将Linq语句转化为数据的SQL语句,它与ADO.Net进行通信,ADO.Net又向数据库发送或检索数据。

ADO.Net Data Provider:这一层使用标准的ADO.Net库与数据库通讯。


Context类

在EF中context非常重要,它类继承自DbContext,它表示一个与数据库的会话。下面的代码是context类的示例:

public class SchoolContext:DbConext{
    public SchoolContext(){
}

public DbSet<Student> Students {get;set;}
public DbSet<StudentAddress> StudentAddresses {get;set;}
public DbSet<Grade> Grades {get;set;}

}

上面的示例中,SchoolContext继承自DbContext,使得他成为了一个context类。它包含了Student,StudentAddress以及Grade的实体集合。

context类用于从数据库中查询或保存数据。也可以用来配置领域模型,数据库关系映射,变更追踪变更设置,缓存,事务等。

EF中的实体

EF中的实体是应用程序的领域类,他被包含在context类的DbSet<TEntity>类型属性中。EF API将TEntity映射到数据库中的表,TEntity的属性映射为表中的列。比如,在school应用程序中,Student,StudentAddress和Grade的领域模型如下:

 public class Student{
    public int StudentID {get;set;}
    public string StudentName {get;set;}
    public DateTime? DateOfBirth {get;set;}
    public byte[] Photo {get;set;}
    public decimal Height {get; set}
    public float Weight {get; set}

    //引用导航属性
    public StudentAddress StudentAddress {get; set;}
    public Grade Grade {get; set;}
}

public partial class StudentAddress{
    public int StudentID { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }

    //引用导航属性
    public Student Student { get; set; }
}

public class Grade
{
    public int GradeId { get; set; }
    public string GradeName { get; set; }
    public string Section { get; set; }

    //集合导航属性
    public ICollection&lt;Student&gt; Students { get; set; }
}

当他们包含在context类中的DbSet<TEntity>属性中时,它们就是实体。而Students, StudentAddresses和Grades被称为实体集。

实体包含两种类型的属性:标量属性(Scalar Properties)和导航属性(Navigation Properties)。基本类型的属性称为标量属性,标量属性存储实际的数据,标量属性映射到数据中表的列。导航属性表示该属性关联到另一个实体,这里又有两种类型的导航属性:引用导航和集合导航。

  • 引用导航属性表示,一个实体的属性的类型是另一个实体类型。
  • 集合导航属性表示,实体属性的类型是集合类型。

EF中实体的类型

EF中有两种实体类型:POCO实体和动态代理实体(Dynamic Proxy Entity)。

  • POCO实体:POCO就是一个基本类,不依赖任何框架,EF 6和EF Core都支持POCO实体。POCO实体通过EDM生成实体类型,支持CRUD操作。
  • 动态代理(POCO Proxy)是运行时的代理类,它包裹了POCO实体,动态代理实体可以lazy loading。动态代理类只支持EF6(EF Core 2.0 不支持该类型)。

实体的状态

EF API维护实体的状态。context类执行实体操作时,会影响实体的状态。实体的状态用枚举来表示,EF 6中是System.Data.Entity.EntityState枚举类型,而EF Core中是Microsoft.EntityFrameworkCore.EntityState枚举类型。他们有如下的枚举值:

  1. Added 执行insert命令
  2. Modified 执行update命令
  3. Deleted 执行delete命令
  4. Unchanged 无任何改变
  5. Detached 不追踪实体的状态

context不仅保存所有实体的引用(从数据库中获取),而且还能追踪和维护实体的状态(这个功能叫变更追踪)。context仅会自动处理实体从Unchanged状态到Modified状态。其他状态的改变必须使用明确的DbContext或DbSet方法。在调用context.SaveChanges()方法时,EF API是基于实体的state创建和执行增删改语句的。

开发模式

EF有三种不同的模式供开发者选择:

  1. Database-First
  2. Code-First
  3. Model-First
发布了83 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/MrLsss/article/details/104625415