Entity Framework - DbContext

使用实体框架,您可以使用称为实体的公共语言运行时(CLR)对象来查询,插入,更新和删除数据.实体框架将模型中定义的实体和关系映射到数据库.它还为&提供设施;

  • 将数据库中返回的数据实体化为实体对象

  • 跟踪对对象所做的更改

  • 处理并发性

  • 将对象更改传播回数据库

  • 将对象绑定到控件

负责与数据作为对象进行交互的主类是System.Data.Entity.DbContext. DbContext API不作为.NET Framework的一部分发布.为了更灵活和频繁地向Code First和DbContext API发布新功能,Entity Framework团队通过Microsoft的NuGet分发功能分发EntityFramework.dll.

  • NuGet允许您通过将相关的DLL直接从Web中提取到项目中来添加对.NET项目的引用.

  • 一个名为Library Package Manager的Visual Studio扩展提供了一种简单的方法,可以将适当的程序集从Web中提取到项目中.

DbContext

  • DbContext API主要用于简化您与实体框架的交互.

  • 它还减少了访问常用任务所需的方法和属性数量.

  • 在以前版本的Entity Framework中,这些任务通常很复杂over和code.

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

定义DbContext派生类

使用上下文的推荐方法是定义一个派生自DbContext的类,并公开表示上下文中指定实体的集合的DbSet属性.如果您正在使用EF Designer,将为您生成上下文.如果您正在使用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.

查询

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

  • 添加新实体.

  • 更改或更新现有实体的属性值.

  • 删除现有实体.

添加新实体

使用Entity Framework添加新对象就像构建对象的新实例并使用它注册一样简单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();

      }
   }
}

删除现有实体

要使用Entity Framework删除实体,请在DbSet上使用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();
   }
}