EF 6 DB-First系列--Entity Framework中的DbContext(数据库上下文)

Entity Framework中的DbContext(数据库上下文)

正如您在前面的创建实体数据模型一节中所看到的,EDM包括从System.Data.Entity.DbContext类派生的SchoolDBEntities类,如下所示。派生DbContext的类在实体框架中称为上下文类。

在这里插入图片描述

DbContext是实体框架API中的一个重要类。它是域或实体类与数据库之间的桥梁。

在这里插入图片描述

DbContext是负责与数据库交互的主要类。它负责下列活动:

Querying: 将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库。

Change Tracking: 跟踪从数据库查询后实体上发生的更改。

Persisting Data: 根据实体状态对数据库执行插入、更新和删除操作。

Caching: 默认情况下提供第一级缓存。它存储在上下文类的生命周期内检索到的实体。

Manage Relationship: 在Db-First或Model-First中使用CSDL、MSL和SSDL管理关系,并在Code-First中使用fluent API配置。

Object Materialization: 将数据库中的原始数据转换为实体对象。

下面是上一节中使用EDM为SchoolDB数据库生成的SchoolDBEntities类(派生自DbContext的上下文类)的示例。

namespace EFTutorials
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Data.Entity.Core.Objects;
    using System.Linq;
    
    public partial class SchoolDBEntities : DbContext
    {
        public SchoolDBEntities()
            : base("name=SchoolDBEntities")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
    
        public virtual DbSet<Course> Courses { get; set; }
        public virtual DbSet<Standard> Standards { get; set; }
        public virtual DbSet<Student> Students { get; set; }
        public virtual DbSet<StudentAddress> StudentAddresses { get; set; }
        public virtual DbSet<Teacher> Teachers { get; set; }
        public virtual DbSet<View_StudentCourse> View_StudentCourse { get; set; }
    
        public virtual ObjectResult<GetCoursesByStudentId_Result> GetCoursesByStudentId(Nullable<int> studentId)
        {
               var studentIdParameter = studentId.HasValue ? 
               new ObjectParameter("StudentId", studentId) : 
               new ObjectParameter("StudentId", typeof(int));
    
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<GetCoursesByStudentId_Result>("GetCoursesByStudentId", studentIdParameter);
        }
    
        public virtual int sp_DeleteStudent(Nullable<int> studentId)
        {
            var studentIdParameter = studentId.HasValue ?
                new ObjectParameter("StudentId", studentId) :
                new ObjectParameter("StudentId", typeof(int));
    
            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_DeleteStudent", studentIdParameter);
        }
    
        public virtual ObjectResult<Nullable<decimal>> sp_InsertStudentInfo(Nullable<int> standardId, string studentName)
        {
                var standardIdParameter = standardId.HasValue ?
                new ObjectParameter("StandardId", standardId) :
                new ("StandardId", typeof(int));
    
            var studentNameParameter = studentName != null ?
                new ObjectParameter("StudentName", studentName) :
                new ObjectParameter("StudentName", typeof(string));
    
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<decimal>>("sp_InsertStudentInfo", standardIdParameter, studentNameParameter);
        }
    
        public virtual int sp_UpdateStudent(Nullable<int> studentId, Nullable<int> standardId, string studentName)
        {
                var studentIdParameter = studentId.HasValue ?
                new ObjectParameter("StudentId", studentId) :
                new ObjectParameter("StudentId", typeof(int));
    
                var standardIdParameter = standardId.HasValue ?
                new ObjectParameter("StandardId", standardId) :
                new ObjectParameter("StandardId", typeof(int));
    
                var studentNameParameter = studentName != null ?
                new ObjectParameter("StudentName", studentName) :
                new ObjectParameter("StudentName", typeof(string));
    
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_UpdateStudent", studentIdParameter, standardIdParameter, studentNameParameter);
        }
    }
}    

正如您在上面的例子中所看到的,上下文类(SchoolDBEntities)包含所有实体的DbSet类型的实体集。它还包括用于EDM中包含的存储过程和视图的函数。

OnModelCreating方法允许我们在EF 6中使用DbModelBuilder Fluent API配置模型。

DbContext Methods

方法使用
Entry获取给定实体的DbEntityEntry。entry provides 提供了对实体的变更跟踪信息和操作的访问。
SaveChanges对数据库中处于添加、修改和删除状态的实体执行INSERT、UPDATE和DELETE命令。
SaveChangesAsyncSaveChanges()的异步方法
Set创建一个DbSet,用于查询和保存TEntity实例。
OnModelCreating重写此方法以进一步配置上下文中DbSet属性中公开的实体类型的模型以及关联关系。

DbContext Properties

方法使用
ChangeTracker提供对上下文正在跟踪的实体实例的信息和操作的访问。
Configuration提供对配置选项的访问。
Database提供对数据库相关信息和操作的访问。

参考

https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值