实体框架 - DbContext
实体框架使您能够使用公共语言运行时 (CLR) 对象(称为实体)查询、插入、更新和删除数据。实体框架将模型中定义的实体和关系映射到数据库。它还提供了以下设施: −
- 将数据库返回的数据具体化为实体对象
- 跟踪对对象所做的更改
- 处理并发
- 将对象更改传播回数据库
- 将对象绑定到控件
负责与数据作为对象进行交互的主要类是 System.Data.Entity.DbContext。DbContext API 不作为 .NET Framework 的一部分发布。为了更加灵活和频繁地向 Code First 和 DbContext API 发布新功能,Entity Framework 团队通过 Microsoft 的 NuGet 分发功能分发 EntityFramework.dll。
NuGet 允许您通过将相关 DLL 直接从 Web 拉入您的项目来添加对 .NET 项目的引用。
Visual Studio 扩展库包管理器提供了一种将相应程序集从 Web 拉入项目的简便方法。
DbContext API 主要用于简化您与 Entity Framework 的交互。
它还减少了访问常用任务所需的方法和属性的数量。
在 Entity Framework 的早期版本中,这些任务通常很复杂发现并编码。
上下文类在运行时管理实体对象,包括使用数据库中的数据填充对象、更改跟踪以及将数据持久保存到数据库。
定义 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)中都很有用且简单。
查询
您可以使用三种类型的查询,例如 −
- 添加新实体。
- 更改或更新现有实体的属性值。
- 删除现有实体。
添加新实体
使用 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 适用于现有实体和新添加的实体。对已添加但尚未保存到数据库的实体调用 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(); } }