DbContext:上下文

EDM将生成从System.Data.Entity.DbContext类派生的SchoolDBEntities类,如下所示。派生DbContext的类在实体框架中被称为上下文类。

在EntityFramework 4.1之前,EDM用于生成从ObjectContext类派生的上下文类。使用ObjectContext有点棘手。DbContext在概念上与ObjectContext相似。

它是ObjectContext的一个包装器,在所有的开发模型中都是有用的:Code First,Model First和Database First。

DbContext是实体框架的重要组成部分。它是您的域或实体类与数据库之间的桥梁。

DbContext是负责与数据交互作为对象的主要类。DbContext负责以下活动:

  • EntitySet: DbContext包含映射到数据库表的所有实体的实体集(DbSet <TEntity>)。
  • 查询(QueryingTo DB): DbContext将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库。
  • 更改跟踪(Change Tracking):跟踪实体在从数据库查询后发生的更改。
  • 持久数据(Persistence):它还根据实体的状态对数据库执行插入,更新和删除操作。
  • 缓存(Caching): DbContext默认进行一级缓存。它存储在上下文类生命周期中已经被检索的实体。
  • 管理关系(Manage Relationship): DbContext还使用DB-First或Model-First方法使用CSDL,MSL和SSDL或者使用Code-First方法使用流利的API来管理关系。
  • 对象实现(Object Materialization): DbContext将原始表数据转换为实体对象。

Context类重写OnModelCreating方法。参数DbModelBuilder被称为Fluent API,可以用Code-First方法配置实体。(我们现在可以不用研究这个)

实例化 DbContext

从DbContext获取ObjectContext:

对于所有常见任务,DBContext API比ObjectContext API更易于使用。但是,您可以从DBContext获取ObjectContext的引用,以便使用ObjectContext的一些功能。这可以通过使用IObjectContextAdpter来完成,如下所示:

实体框架中的实体类型:

EDM包含数据库中每个表的实体。实体框架5.0 / 6.0中有两种类型的实体:POCO实体和动态代理实体。

POCO实体(普通的旧CLR对象):

POCO类是不依赖任何框架特定的基类的类。它就像任何其他正常的.net类,这就是为什么它被称为“普通旧CLR对象”。

这些POCO实体(也称为持久性无关对象)支持大部分与由实体数据模型生成的实体类型相同的查询,插入,更新和删除行为。以下是Student POCO实体的一个例子。

动态代理(POCO代理):

动态代理是POCO实体的运行时代理类。它就像一个POCO实体的包装类。动态代理实体允许延迟加载自动更改跟踪

POCO实体应符合以下要求成为POCO代理人:

  1. POCO类必须声明为公共访问。
  2. 一个POCO类不能被密封(在Visual Basic中不可以)
  3. POCO类不能是抽象的(Visual Basic中的MustInherit)。
  4. 每个导航属性都必须声明为公共的,虚拟的
  5. 每个集合属性必须是ICollection <T>
  6. ProxyCreationEnabled选项在上下文类中不能为false(默认为true)

以下学生POCO实体满足上述所有要求,以便在运行时成为动态代理实体。

注意:默认情况下动态代理为每个实体启用。但是,您可以通过在上下文类中将ProxyCreationEnabled选项设置为false来禁用动态代理。

EDM默认生成符合上述动态代理要求的POCO实体。

在运行时,Student的类型将是System.Data.Entity.DynamicProxies.Student,如下所示:

从动态代理获取实际的实体类型:

您可以使用ObjectContext.GetObjectType()来查找动态代理的实际类型,如下所示:

实体可以有两种类型的属性,标量和导航属性。

标量属性:

标量属性是实际值包含在实体中的属性。例如,Student实体具有标量属性,如StudentId和StudentName。这些对应于Student表列。

导航属性:

导航属性是指向其他相关实体的指针。学生将标准属性作为导航属性,使应用程序能够从学生导航到相关的标准实体。

实体关系:

实体框架支持三种类型的关系,与数据库一样:1)一对一2)一对多,3)多对多。

一对一        一个学生只有一个地址

一对多       一个老师只有一个标准

正如您在上面的代码片段中看到的,标准实体类具有ICollection类型的Teachers属性,以便它可以包含多个Teacher对象。(它使用HashSet <Teacher>在构造函数中初始化Teachers属性,以便您可以将Teacher对象添加到集合中,而不必担心初始化。) 我们创建的时候勾选了外键所以这个类出现了 StandardId属性。

多对多         一个学生可以报名参加很多课程,而且一门课程可以教给很多学生。

注:实体框架支持许多一对多的关系,只有当接合表(StudentCourse在这种情况下)不包括除两个表中的PK之外的任何列(只有两个主键)。如果连接表包含其他列(如DateCreated),则EDM也会为中间表创建实体,并且您将不得不手动管理多对多实体的CRUD操作。

在XML视图中打开EDM。您可以看到SSDL(概念架构)具有StudentCourse实体集,但是CSDL(存储架构)没有StudentCourse实体集。而是将其映射到学生和课程实体的导航属性中。在MSL(CS映射)中,它将Student和Course之间的映射放入<AssociationSetMapping />的StudentCourse表中

因此,EDM中的CS映射正在管理多对多关系。因此,当您在课程中添加学生或在学生实体中添加课程时,当您保存它时,会将添加的学生和课程的PK插入StudentCourse表中。所以这个映射不仅可以直接在两个实体之间建立一个方便的关联,还可以管理这个关节的查询,插入和更新。

实体生命周期:

在实体的生命周期中,每个实体都有一个基于通过上下文(DbContext)对其执行的操作的实体状态。实体状态是System.Data.Entity.EntityState类型的枚举,包含以下值:

  1. 添加
  2. 删除
  3. 改性
  4. 不变
  5. 超脱

上下文不仅保存了从数据库中检索到的所有对象的引用,而且保存了实体状态,并保持对实体属性的修改。此功能被称为更改跟踪

实体状态从“未更改”状态到“已修改”状态的更改是上下文自动处理的唯一状态。所有其他更改必须使用DbContext和DbSet的适当方法显式进行。

下图说明了在实体上执行的操作如何改变其状态,这又反过来影响了数据库操作。

当我们只了一些增删改的操作,如果需要保存到数据库就需要调用上下文的 SavaChanges()方法。

Entity Framework 三的更多相关文章

  1. EF3:Entity Framework三种开发模式实现数据访问

    前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...

  2. Entity Framework 基础

    在忙碌中渡过了5,6,7 月份,现在些抽点时间对Entity Framework的使用做一些基础的回忆. Entity Framework 是什么? Entity Framework(EF)和我们所熟 ...

  3. 第三篇 Entity Framework Plus 之 Query Cache

    离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (13) -----第三章 查询之使用Entity SQL

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-4使用实体SQL查询模型 问题 你想通过执行Entity SQL语句来查询你的实 ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (16) -----第三章 查询之左连接和在TPH中通过派生类排序

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-10应用左连接 问题 你想使用左外连接来合并两个实体的属性. 解决方案 假设你有 ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16  过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...

  9. Entity Framework Code First (三)Data Annotations

    Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表 ...

随机推荐

  1. maven pom.xml指定jdk

    <plugins> <!-- 指定jdk --> <plugin> <groupId>org.apache.maven.plugins</grou ...

  2. HDU 1166——敌兵布阵——————【线段树单点增减、区间求和】

    敌兵布阵 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  3. C++程序设计基础(7)位运算

    注:读<程序员面试笔记>笔记总结 1.知识点 运算 符号 说明 与 & 有0为0,都1为1 或 | 由1为1,都0为0 非(取反) ~ 0变1,1变0 异或 ^ 同为0,异为1 左 ...

  4. 机器学习kNN

    from numpy import * import operator def createDataSet(): group = array([[1.0, 1.1], [1.0, 1.0], [0, ...

  5. Oracle中scott用户下基本表练习SQL语句

    --选择部门中30的雇员SELECT * from emp where DEPTNO=30;--列出所有办事员的姓名.部门.编号--采用内连接方式,也就是等值链接,也是最常用的链接SELECT ena ...

  6. Vue2.0+Node.js+MongoDB全栈打造商城系统

    vue.js +axios mock数据 在main.js中 import axios from 'axios' Vue.prototype.$ajax = axios webpack.dev.con ...

  7. Javascript:各种宽高

    Javascript: IE中:document.body.clientWidth ==> BODY对象宽度document.body.clientHeight ==> BODY对象高度d ...

  8. SharePoint 2013 - Cross-domain Library

    首先,参考链接:https://msdn.microsoft.com/en-us/library/office/fp179893.aspx?f=255&MSPPError=-214721739 ...

  9. 【JS 综合】JS综合

    视频教程链接:http://www.xuexi111.com/s/javascript/ 张孝祥:http://www.21edu8.com/pcnet/programming/26685/

  10. 去掉iframe白色背景方法

    在iframe内添加如下代码 style="display:none" onload="this.style.display = 'block';" 先让它不显 ...