猿教程 Logo

DBContext

如您所见在前面 创建实体数据模型 节中,EDM产生了一个派生自System.Data.Entity.DbContext的SchoolDBEntities类,如下所示。 派生的类DbContext称为实体框架的上下文类。


EntityFramework 4.1之前,EDM生成的上下文类派生自ObjectContext类。 使用ObjectContext稍微有点棘手, DbContext在概念上与ObjectContext类似。 它是在ObjectContext上包装起来并且适合所有的开发模式:Code First, Model First and Database First。

DbContext是实体框架的一个重要组成部分。 他是一个域或实体类和数据库之间的桥梁。


DbContext主要负责与数据交互。 DbContext负责以下活动:

EntitySet: DbContext包含所有的实体映射到数据库表的实体集(DbSet < TEntity >)。

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

更改跟踪: 它跟踪每个实体从数据库中查询出来后发生的修改变化。

持久化数据: 它也基于实体状态执行插入、更新和删除操作到数据库中。

缓存: DbContext默认第一级缓存。

对象实例化: DbContext将原始表数据转换成实体对象。

下面是在前面的课程中生成的一个例子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 < TEntity >。  它还包括EDM所包含的存储过程和视图的执行函数。

上下文类覆盖OnModelCreating方法。 可以用来在Code-first开始模式中配置实体。


实例化DbContext

您可以通过实例化上下文类来使用DbContext做一些CRUD操作,如下所示。

using (var ctx = new SchoolDBEntities())
{
        
    //Can perform CRUD operation using ctx here..
}



从DbContext获取到ObjectContext

DBContext API比ObjectContext API在常规操作上更容易使用。 然而,如果你想要使用ObjectContext的一些特性,你可以从DBContext获取ObjectContext的引用。可以通过IObjectContextAdpter 来获取。

using (var ctx = new SchoolDBEntities())
{
    var objectContext = (ctx as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext;
        
    //use objectContext here..
}

EDM还生成了实体类。 在下一章我们将了解不同类型的实体。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/dbcontext.html