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命令。 |
SaveChangesAsync | SaveChanges()的异步方法 |
Set | 创建一个DbSet,用于查询和保存TEntity实例。 |
OnModelCreating | 重写此方法以进一步配置上下文中DbSet属性中公开的实体类型的模型以及关联关系。 |
DbContext Properties
方法 | 使用 |
---|---|
ChangeTracker | 提供对上下文正在跟踪的实体实例的信息和操作的访问。 |
Configuration | 提供对配置选项的访问。 |
Database | 提供对数据库相关信息和操作的访问。 |
参考
https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/