Entity Framework 教程——DBContext

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
2 using (var ctx = new SchoolDBEntities())
3 {
4
5     //在这里执行CRUD操作..
6 }
7      

从DbContext 中获取ObjectContext :

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

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

时间: 2024-12-15 06:55:50

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

Entity Framework教程(第二版)

源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,EF6.1已经发布很久,EF7马上就到来.那篇文章已经显得相当过时,这期间园子里出现了很多介绍EF4/5/6版本的精彩文章,我的工作中也没有在持续使用EF,本来也就不准备再写现在这篇文章了.后来看到之前那篇文章还是有很多朋友在评论里给予鼓励,再加上自己确实在使用新版EF的过程中也总结了一些心得,解决了

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

源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,EF6.1已经发布很久,EF7马上就到来.那篇文章已经显得相当过时,这期间园子里出现了很多介绍EF4/5/6版本的精彩文章,我的工作中也没有在持续使用EF,本来也就不准备再写现在这篇文章了.后来看到之前那篇文章还是有很多朋友在评论里给予鼓励,再加上自己确实在使用新版EF的过程中也总结了一些心得,解决了

Entity Framework 教程——概述

Entity Framework 基础 本教材将手把手教你使用entity framework,我们将使用entity framework 6.0和visual studio 2012. 以下表格是entity framework的各个重大版本 版本 功能 EF 3.5 提供database first功能 EF 4.0 POCO( Plain Old CLR Object / POCO )支持,延迟加载,可测试性改进.可自定义代码生成和 Model First 工作流. EF 4.1 在Nug

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

安装Entity Framework环境 Entity Framework 5.0 API分布在两个地方,一个可在NuGet包管理器中找到,一个存在于.NET framework中..NET framework 4.0/4.5包含EF核心API,通过NuGet包管理器下载的EntityFramework.dll则包含EF5.0的特殊功能. 然而在EF6.0中只需从NuGet包管理器下载EntityFramework.dll,而不依赖于.NET framework. 该基础教程使用EF6.0版本编

Entity Framework 教程——Entity Framework中的实体类型

Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. POCO Entity (Plain Old CLR Object): POCO类是不依赖任何框架的类型,如同其他正常的一般类型,我们称之为"Plain Old CLR Objects"(这里不知道怎么翻译,普通的CLR对象?古老的CLR对象?大概意思就是没有什么特殊的对象吧). POC

Entity Framework 教程——什么是Entity Framework

什么是Entity Framework 编写和管理ADO.NET是一个繁琐而又无聊的工作.微软为你的应用提供了一个名为"Entity Framework"的ORM框架来自动化管理你的数据库. 微软对Entity Framework给出了以下定义: EF是一个对象关系映射(ORM)框架,它能使开发人员用关系型数据定义特定领域的对象,并且开发人员不再需要编写大量的数据库访问代码.使用Entity Framework,开发人员用Linq帮助他们进行查询,检索出的数据自动生成强类型对象.EF提

Entity Framework 教程——模型浏览器

模型浏览器: 在之前的章节中,我们创建了第一个关于学校的实体数据模型.但是EDM设计器并没有将他所创建的所有对象完全显示出来.它只将数据库中的被选择的表与视图显示出来了. 模型浏览器可以将EDM所创建的所有对象和函数的信息都显示出来.右键EDM设计器并在菜单中选择模型浏览器即可打开. 模型浏览器包含EDM的所有信息,如概念模型,存储模型,映射关系都在其中. 如上图所示,模型浏览器包含以下对象: Diagrams: 模型浏览器包含EDM的可视化关系图.我们可以看到EDM默认会创建一个关系图.当然,

Entity Framework 教程——EF体系结构

EF体系结构 下图是一张EF体系结构的全景图,让我们单独了解各个组件的用处. EDM (Entity Data Model): EDM由3个主要部分组成,概念模块(Conceptual Model),映射(Mapping),存储模块(Storage Model). Conceptual Model: 概念模型包含模型类还有他们之间的关系,它不受数据库设计的影响. Storage Model: 存储模型代表数据库的设计,包括表.视图.存储过程.表间关系及主外键. Mapping: 映射是指将概念模

EF Entity Framework Core DBContext中文文档

Add(Object) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的可访问实体,以便在调用SaveChanges()时将它们插入数据库.使用State设置单个实体的状态. Add<TEntity>(TEntity) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的可访问实体,以便在调用SaveChanges()时将它们插入数据库.使用State设置单个实体的状态. AddAsync(Object, CancellationToken) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的