实体框架 - DbContext



实体框架使您能够使用称为实体的公共语言运行时 (CLR) 对象查询、插入、更新和删除数据。实体框架将模型中定义的实体和关系映射到数据库。它还提供以下功能:

  • 将从数据库返回的数据具体化为实体对象
  • 跟踪对对象进行的更改
  • 处理并发
  • 将对象更改传播回数据库
  • 将对象绑定到控件

负责以对象形式与数据交互的主要类是 System.Data.Entity.DbContext。DbContext API 并非作为 .NET Framework 的一部分发布。为了能够更灵活、更频繁地向 Code First 和 DbContext API 发布新功能,实体框架团队通过 Microsoft 的 NuGet 分发功能分发 EntityFramework.dll。

  • NuGet 允许您通过从 Web 直接将相关的 DLL 拉入您的项目来向您的 .NET 项目添加引用。

  • 一个名为库包管理器 Visual Studio 扩展提供了一种简单的方法,可以将合适的程序集从 Web 拉入您的项目。

DbContext
  • DbContext API 主要针对简化与实体框架的交互。

  • 它还减少了您需要访问的用于执行常用任务的方法和属性的数量。

  • 在早期版本的实体框架中,这些任务通常难以发现和编码。

  • 上下文类在运行时管理实体对象,包括使用来自数据库的数据填充对象、更改跟踪以及将数据持久化到数据库。

定义 DbContext 派生类

使用上下文的首选方法是定义一个从 DbContext 派生的类,并公开表示上下文中指定实体集合的 DbSet 属性。如果您正在使用 EF 设计器,则会为您生成上下文。如果您使用的是 Code First,则通常会自己编写上下文。

以下代码是一个简单的示例,它显示 UniContext 是从 DbContext 派生的。

  • 您可以将自动属性与 DbSet 一起使用,例如 getter 和 setter。

  • 它还使代码更加简洁,但在您没有其他逻辑要应用的情况下,您不需要将其用于创建 DbSet 的目的。

public class UniContext : DbContext {
   public UniContext() : base("UniContext") { }
   public DbSet<Student> Students { get; set; }
   public DbSet<Enrollment> Enrollments { get; set; }
   public DbSet<Course> Courses { get; set; }
}
  • 以前,EDM 用于生成从 ObjectContext 类派生的上下文类。

  • 使用 ObjectContext 稍微复杂一些。

  • DbContext 是 ObjectContext 的一个包装器,它实际上类似于 ObjectContext,并且在所有开发模型(如 Code First、Model First 和 Database First)中都非常有用且易于使用。

查询

您可以使用三种类型的查询,例如:

  • 添加新实体。
  • 更改或更新现有实体的属性值。
  • 删除现有实体。

添加新实体

使用实体框架添加新对象就像构造对象的实例并使用 DbSet 上的 Add 方法注册它一样简单。以下代码用于将新学生添加到数据库。

private static void AddStudent() {

   using (var context = new UniContext()) {

      var student = new Student {
         LastName = "Khan", 
         FirstMidName = "Ali", 
         EnrollmentDate = DateTime.Parse("2005-09-01") 
      };

      context.Students.Add(student); 
      context.SaveChanges();

   }
}

更改现有实体

更改现有对象就像更新分配给您想要更改的属性的值并调用 SaveChanges 一样简单。在以下代码中,Ali 的姓氏已从 Khan 更改为 Aslam。

private static void AddStudent() {

   private static void ChangeStudent() {

      using (var context = new UniContext()) {

         var student = (from d in context.Students
            where d.FirstMidName == "Ali" select d).Single();
         student.LastName = "Aslam";
         context.SaveChanges();

      }
   }
}

删除现有实体

要使用实体框架删除实体,您可以在 DbSet 上使用 Remove 方法。Remove 适用于现有实体和新添加的实体。对已添加但尚未保存到数据库的实体调用 Remove 将取消实体的添加。该实体将从更改跟踪器中删除,并且 DbContext 不再跟踪该实体。对正在更改跟踪的现有实体调用 Remove 将在下次调用 SaveChanges 时注册该实体以进行删除。以下示例显示了从数据库中删除名为 Ali 的学生的实例。

private static void DeleteStudent() {

   using (var context = new UniContext()) {
      var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
      context.Students.Remove(bay);
      context.SaveChanges();
   }
}
广告