Entity Framework 三
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代理人:
- POCO类必须声明为公共访问。
- 一个POCO类不能被密封(在Visual Basic中不可以)
- POCO类不能是抽象的(Visual Basic中的MustInherit)。
- 每个导航属性都必须声明为公共的,虚拟的
- 每个集合属性必须是ICollection <T>
- 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类型的枚举,包含以下值:
- 添加
- 删除
- 改性
- 不变
- 超脱
上下文不仅保存了从数据库中检索到的所有对象的引用,而且保存了实体状态,并保持对实体属性的修改。此功能被称为更改跟踪。
实体状态从“未更改”状态到“已修改”状态的更改是上下文自动处理的唯一状态。所有其他更改必须使用DbContext和DbSet的适当方法显式进行。
下图说明了在实体上执行的操作如何改变其状态,这又反过来影响了数据库操作。

当我们只了一些增删改的操作,如果需要保存到数据库就需要调用上下文的 SavaChanges()方法。
Entity Framework 三的更多相关文章
- EF3:Entity Framework三种开发模式实现数据访问
前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...
- Entity Framework 基础
在忙碌中渡过了5,6,7 月份,现在些抽点时间对Entity Framework的使用做一些基础的回忆. Entity Framework 是什么? Entity Framework(EF)和我们所熟 ...
- 第三篇 Entity Framework Plus 之 Query Cache
离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...
- 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (13) -----第三章 查询之使用Entity SQL
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-4使用实体SQL查询模型 问题 你想通过执行Entity SQL语句来查询你的实 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (16) -----第三章 查询之左连接和在TPH中通过派生类排序
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-10应用左连接 问题 你想使用左外连接来合并两个实体的属性. 解决方案 假设你有 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16 过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...
- Entity Framework Code First (三)Data Annotations
Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表 ...
随机推荐
- 查询指定tomcat应用的进程数
假设应用名称为pear,查询指定tomcat应用pear的进程数: ps -ef |grep "/datong/tomcat-pear/" |grep -v tail | grep ...
- js 标签属性与导航
导航标签的方法: 一 , 全局导航: 1.通过by id导航 <!DOCTYPE html><html lang="en"><head> &l ...
- python 批量ping服务器
最近在https://pypi.python.org/pypi/mping/0.1.2找到了一个python包,可以用它来批量ping服务器,它是中国的大神写的,支持单个服务器.将服务器IP写在txt ...
- Codeforces 975D. Ghosts
Description 给出一条直线 \(a*x+b\) 上的 \(n\) 个点,每一个点有一个速度 \((v_x,v_y)\),求 \(T=[-oo,oo]\) 相交的次数乘以 \(2\) 题面 S ...
- concat、concat_ws、group_concat函数用法
一.concat()函数可以连接一个或者多个字符串 CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. select conc ...
- IOS微信浏览器点击事件不起作用问题
问题: $(document).on("click",".btn",function(){alert("1")}); 在微信浏览器上点击不起 ...
- jquery.rotate.js可选抽奖次数和中奖内容的转盘抽奖demo
需求: 最多可以抽奖5次,而且,每次只会中“2000元理财金”或者“谢谢参与”,其它的不会抽中(哈哈,果然都是套路). 效果如下: 一.页面结构: <div class="g-cont ...
- HTML <frameset> 标签
<frameset></frameset>:框架标签,可以将页面分割,被frameset标签分割的页面,不允许使用body标签;frameset标签页面内只能出现framese ...
- 14_synchronized深入
[脏读] 对于对象同步和异步的方法,我们在设计程序的时候,一定要考虑问题的整体,不然会出现不一致的错误,最经典的错误的就是脏读(dirty read). [实例代码] package com.higg ...
- java自动生成jar包工具
jar -cfe Main.jar com.xjq.test.Main com/xjq/test/Main.class jar -cmef manifest.mf com.xjq.test.Main ...