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. 查询指定tomcat应用的进程数

    假设应用名称为pear,查询指定tomcat应用pear的进程数: ps -ef |grep "/datong/tomcat-pear/" |grep -v tail | grep ...

  2. js 标签属性与导航

    导航标签的方法:  一 , 全局导航: 1.通过by id导航 <!DOCTYPE html><html lang="en"><head> &l ...

  3. python 批量ping服务器

    最近在https://pypi.python.org/pypi/mping/0.1.2找到了一个python包,可以用它来批量ping服务器,它是中国的大神写的,支持单个服务器.将服务器IP写在txt ...

  4. Codeforces 975D. Ghosts

    Description 给出一条直线 \(a*x+b\) 上的 \(n\) 个点,每一个点有一个速度 \((v_x,v_y)\),求 \(T=[-oo,oo]\) 相交的次数乘以 \(2\) 题面 S ...

  5. concat、concat_ws、group_concat函数用法

    一.concat()函数可以连接一个或者多个字符串 CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. select conc ...

  6. IOS微信浏览器点击事件不起作用问题

    问题: $(document).on("click",".btn",function(){alert("1")}); 在微信浏览器上点击不起 ...

  7. jquery.rotate.js可选抽奖次数和中奖内容的转盘抽奖demo

    需求: 最多可以抽奖5次,而且,每次只会中“2000元理财金”或者“谢谢参与”,其它的不会抽中(哈哈,果然都是套路). 效果如下: 一.页面结构: <div class="g-cont ...

  8. HTML <frameset> 标签

    <frameset></frameset>:框架标签,可以将页面分割,被frameset标签分割的页面,不允许使用body标签;frameset标签页面内只能出现framese ...

  9. 14_synchronized深入

    [脏读] 对于对象同步和异步的方法,我们在设计程序的时候,一定要考虑问题的整体,不然会出现不一致的错误,最经典的错误的就是脏读(dirty read). [实例代码] package com.higg ...

  10. java自动生成jar包工具

    jar -cfe Main.jar com.xjq.test.Main com/xjq/test/Main.class jar -cmef manifest.mf com.xjq.test.Main ...