DBContext:

在之前的章节《创建实体数据模型》中,EDM为我们创建了SchoolDBEntities 类,它派生子System.Data.Entity.DbContext这个类,这个DbContext在EF中被称作上下文类。

在EF4.1之前,EDM生成的上下文类是派生自ObjectContext这个类的。它有点难于使用。DbContext 在概念上类似于ObjectContext。DbContext 只是对ObjectContext 进行了封装使其更容易在所有开发场景中使用。(如Code First, Model First 和 Database First 中)

DbContext 是EF中重要的一环,它是数据库与你应用程序域或实体类的桥梁。

DbContext 是负责数据与对象互操作的主要的类型。它主要负责以下一些动作:

EntitySet : DbContext 包含所有从数据库表中被映射出来的实体对象的集合(如DbSet<TEntity>)。

Querying : DbContext 将LINQ To Entities 转化为SQL 查询语句并发送至数据库。

Change Tracking : 它保持变更追踪,一旦实体对象发生改变它就会从数据库中进行查询。

Persisting Data : 它也可以基于实体状态对数据库进行插入,更新和删除操作。

Caching : DbContext 默认作一级缓存,它存储在上下文类的生命周期中检索过的实体对象。

Manage Relationship : 在DB-First 或 Model-First 中 DbContext 使用CSDL, MSL 和 SSDL 管理关系,在Code-First中使用流式API管理关系。

Object Materialization : DbContext 将原始的表数据转化至实体对象中。

以下例子中的SchoolDBEntities 类是又EDM根据SchoolDB数据库创建的

  1. namespace EFTutorials
  2. {
  3. using System;
  4. using System.Data.Entity;
  5. using System.Data.Entity.Infrastructure;
  6. using System.Data.Entity.Core.Objects;
  7. using System.Linq;
  8.  
  9. public partial class SchoolDBEntities : DbContext
  10. {
  11. public SchoolDBEntities()
  12. : base("name=SchoolDBEntities")
  13. {
  14. }
  15.  
  16. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  17. {
  18. throw new UnintentionalCodeFirstException();
  19. }
  20.  
  21. public virtual DbSet<Course> Courses { get; set; }
  22. public virtual DbSet<Standard> Standards { get; set; }
  23. public virtual DbSet<Student> Students { get; set; }
  24. public virtual DbSet<StudentAddress> StudentAddresses { get; set; }
  25. public virtual DbSet<Teacher> Teachers { get; set; }
  26. public virtual DbSet<View_StudentCourse> View_StudentCourse { get; set; }
  27.  
  28. public virtual ObjectResult<GetCoursesByStudentId_Result> GetCoursesByStudentId(Nullable<int> studentId)
  29. {
  30. var studentIdParameter = studentId.HasValue ?
  31. new ObjectParameter("StudentId", studentId) :
  32. new ObjectParameter("StudentId", typeof(int));
  33.  
  34. return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<GetCoursesByStudentId_Result>("GetCoursesByStudentId", studentIdParameter);
  35. }
  36.  
  37. public virtual int sp_DeleteStudent(Nullable<int> studentId)
  38. {
  39. var studentIdParameter = studentId.HasValue ?
  40. new ObjectParameter("StudentId", studentId) :
  41. new ObjectParameter("StudentId", typeof(int));
  42.  
  43. return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_DeleteStudent", studentIdParameter);
  44. }
  45.  
  46. public virtual ObjectResult<Nullable<decimal>> sp_InsertStudentInfo(Nullable<int> standardId, string studentName)
  47. {
  48. var standardIdParameter = standardId.HasValue ?
  49. new ObjectParameter("StandardId", standardId) :
  50. new ("StandardId", typeof(int));
  51.  
  52. var studentNameParameter = studentName != null ?
  53. new ObjectParameter("StudentName", studentName) :
  54. new ObjectParameter("StudentName", typeof(string));
  55.  
  56. return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<decimal>>("sp_InsertStudentInfo", standardIdParameter, studentNameParameter);
  57. }
  58.  
  59. public virtual int sp_UpdateStudent(Nullable<int> studentId, Nullable<int> standardId, string studentName)
  60. {
  61. var studentIdParameter = studentId.HasValue ?
  62. new ObjectParameter("StudentId", studentId) :
  63. new ObjectParameter("StudentId", typeof(int));
  64.  
  65. var standardIdParameter = standardId.HasValue ?
  66. new ObjectParameter("StandardId", standardId) :
  67. new ObjectParameter("StandardId", typeof(int));
  68.  
  69. var studentNameParameter = studentName != null ?
  70. new ObjectParameter("StudentName", studentName) :
  71. new ObjectParameter("StudentName", typeof(string));
  72.  
  73. return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_UpdateStudent", studentIdParameter, standardIdParameter, studentNameParameter);
  74. }
  75. }
  76. }

你可以通过上面的例子看出context 类包含类型为DbSet<TEntity>的所有实体集合。也包含EDM中存储过程及视图所对应的函数。

Context 类重写了 OnModelCreating 方法,参数DbModelBuilder 提供流式API来配置Code-First中实体的关系。

实例化 DbContext:

实例化DbContext 来执行CRUD操作。

  1. using (var ctx = new SchoolDBEntities())
  2. {
  3.  
  4. //在这里执行CRUD操作..
  5. }

从DbContext 中获取ObjectContext :

在常见的任务中DBContext 中的API 相较于ObjectContext 的API 而言更加容易使用。当然你也可以从DBContext 中获取ObjectContext 的引用来使用其中的一些方法。可以同过IObjectContextAdpter 来完成。

  1. using (var ctx = new SchoolDBEntities())
  2. {
  3. var objectContext = (ctx as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext;
  4.  
  5. //在这里使用objectContext..
  6. }

Entity Framework 教程——DBContext的更多相关文章

  1. Entity Framework教程翻译 ---- 系列教程

    Entity Framework教程(第二版) (翻译)Entity Framework技巧系列之十四 - Tip 56 (翻译)Entity Framework技巧系列之十三 - Tip 51 - ...

  2. Entity Framework教程及文章传送门

    Entity Framework视频教程http://www.iqiyi.com/playlist296844502.html Model-Code First做法講解與教學 (ASP.net MVC ...

  3. Entity Framework教程(第二版)

    源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...

  4. Entity Framework 教程——创建实体数据模型

    创建实体数据模型: 本文将带你创建实体数据模型(EDM)SchoolDB数据库和理解基础建设模块. 实体数据模型(EDM)是用于描述实体之间关系的一种模型,以下将使用Visual Studio 201 ...

  5. 【转】Entity Framework教程(第二版)

    源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...

  6. [转]Entity Framework教程(第二版)

    源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...

  7. Entity Framework 教程——安装Entity Framework环境

    安装Entity Framework环境 Entity Framework 5.0 API分布在两个地方,一个可在NuGet包管理器中找到,一个存在于.NET framework中..NET fram ...

  8. Entity Framework 教程——概述

    Entity Framework 基础 本教材将手把手教你使用entity framework,我们将使用entity framework 6.0和visual studio 2012. 以下表格是e ...

  9. Entity Framework中DbContext结合TransactionScope提交事务的正确方式

    问: I would like know what is the best possible way to implement transactions with DBContext. In part ...

随机推荐

  1. 用dubbo时遇到的一个序列化的坑

    首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...

  2. ExtJS 4.2 Date组件扩展:添加清除按钮

    ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...

  3. Android 剪贴板详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Clipboard 如本文有助于你理解 Android 剪贴板,不妨给我一个 Star.对于码农而言, ...

  4. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  5. 企业做数据缓存是使用Memcached还是选Redis?

    企业是使用Memcached还是选Redis? 在构建一款现代且由数据库驱动的Web应用程序并希望使其拥有更为出色的性能表现时,这个问题总会时不时出现.并给每一位开发人员带来困扰.在考虑对应用程序的性 ...

  6. NodeJs支付宝移动支付签名及验签

    非常感谢 :http://www.jianshu.com/p/8513e995ff3a?utm_campaign=hugo&utm_medium=reader_share&utm_co ...

  7. 2016/12/30_Python

    今天主要学习内容: Python: 1.字典的使用 1)怎么创建字典 dicts = {"name":"juncx","age":17} d ...

  8. Windows Server 2008 R2 下配置TLS1.2,添加自签名证书

    前言 2017年1月1日起App Store上的所有App应用将强制开启ATS功能. 苹果的ATS(App Transport Security)对服务器硬性3点要求: ① ATS要求TLS1.2或者 ...

  9. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

  10. 如何让spring mvc web应用启动时就执行特定处理

    Asp.Net的应用中通过根目录下的Global.asax,在Application_Start方法中做一些初始化操作,比如:预先加载缓存项对网站热点数据进行预热,获取一些远程的配置信息等等. Spr ...