实体框架 - 数据库操作
在前面的章节中,您学习了定义实体数据模型的三种不同方法。
其中两种,数据库优先和模型优先,依赖于实体框架设计器与代码生成相结合。
第三种,代码优先,让您跳过可视化设计器,只需编写自己的代码。
无论您选择哪条路径,您最终都会得到域类,并且一个或多个实体框架 DbContext 类允许您检索和保存与这些类相关的数据。
应用程序中的 DbContext API 用作类和数据库之间的桥梁。 DbContext 是实体框架中最重要的类之一。
它能够表达和执行查询。
它从数据库获取查询结果并将其转换为我们的模型类的实例。
它可以跟踪实体的更改,包括添加和删除,然后触发创建插入、更新和删除语句,并根据需要将这些语句发送到数据库。
以下是域广告上下文类,我们将在本章中对其执行不同的操作。这是我们在"数据库优先方法"一章中创建的相同示例。
上下文类实现
using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Data.Entity.Core.Objects; using System.Linq; namespace DatabaseFirstDemo { public partial class UniContextEntities : DbContext { public UniContextEntities(): base("name = UniContextEntities") {} protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public virtual DbSet<Course> Courses { get; set; } public virtual DbSet<Enrollment> Enrollments { get; set; } public virtual DbSet<Student> Students { get; set; } } }
Domain 类实现
Course 类
namespace DatabaseFirstDemo { using System; using System.Collections.Generic; public partial class Course { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public Course() { this.Enrollments = new HashSet<Enrollment>(); } public int CourseID { get; set; } public string Title { get; set; } public int Credits { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<Enrollment> Enrollments { get; set; } } }
Student 类
namespace DatabaseFirstDemo { using System; using System.Collections.Generic; public partial class Student { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public Student() { this.Enrollments = new HashSet<Enrollment>(); } public int ID { get; set; } public string LastName { get; set; } public string FirstMidName { get; set; } public System.DateTime EnrollmentDate { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<Enrollment> Enrollments { get; set; } } }
Enrollment 类
namespace DatabaseFirstDemo { using System; using System.Collections.Generic; public partial class Enrollment { public int EnrollmentID { get; set; } public int CourseID { get; set; } public int StudentID { get; set; } public Nullable<int> Grade { get; set; } public virtual Course Course { get; set; } public virtual Student Student { get; set; } } }
创建操作
使用 Entity Framework 添加新对象非常简单,只需构建对象的新实例并使用 DbSet 上的 Add 方法注册即可。以下代码可让您将新学生添加到数据库中。
class Program { static void Main(string[] args) { var newStudent = new Student(); //set student name newStudent.FirstMidName = "Bill"; newStudent.LastName = "Gates"; newStudent.EnrollmentDate = DateTime.Parse("2015-10-21"); newStudent.ID = 100; //create DBContext object using (var dbCtx = new UniContextEntities()) { //Add Student object into Students DBset dbCtx.Students.Add(newStudent); // call SaveChanges method to save student into database dbCtx.SaveChanges(); } } }
更新操作
更改现有对象非常简单,只需更新分配给要更改的属性的值并调用 SaveChanges 即可。例如,以下代码用于将 Ali 的姓氏从 Khan 更改为 Aslam。
using (var context = new UniContextEntities()) { 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 的学生。
using (var context = new UniContextEntities()) { var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single(); context.Students.Remove(bay); context.SaveChanges(); }
读取操作
从数据库中读取现有数据非常简单。以下代码检索了学生表中的所有数据,然后程序将显示按字母顺序排列的学生姓名。
using (var db = new UniContextEntities()) { var query = from b in db.Students orderby b.FirstMidName select b; Console.WriteLine("All All student in the database:"); foreach (var item in query) { Console.WriteLine(item.FirstMidName +" "+ item.LastName); } Console.WriteLine("Press any key to exit..."); Console.ReadKey(); }