开发手册 欢迎您!
软件开发者资料库

Entity Framework - 数据库操作

Entity Framework数据库操作 - 从概述,体系结构,环境设置,数据库设置,数据模型,DbContext,类型,关系,生命周期,代码优先方法,模型优先方法,数据库优先方法,DEV方法,数据库操作,并发开始学习实体框架,事务,视图,索引,存储过程,断开连接的实体,表值函数,本机SQL,枚举支持,异步查询,持久性,投影查询,命令记录,命令拦截,空间数据类型,继承,迁移,渴望,懒惰,显式加载,验证,跟踪更改,彩色实体,第一个示例,数据注释,Fluent API,种子数据库,代码优先迁移,多个DbContext,嵌套实体类型。

在前面的章节中,您学习了三种不同的方法来定义实体数据模型.

  • 其中两个,数据库优先和模型优先,取决于实体框架设计师与代码生成的结合.

  • 第三,Code First,让你跳过一个视觉设计师,然后写您自己的代码.

  • 无论您选择哪条路径,您最终都会获得域类,并且一个或多个Entity Framework DbContext类允许您检索和保留与这些类相关的数据.

应用程序中的DbContext API用作类和数据库之间的桥梁. DbContext是实体框架中最重要的类之一.

  • 它可以表达和执行查询.

  • 它从数据库中获取查询结果并将它们转换为模型类的实例.

  • 它可以跟踪实体的更改,包括添加和删除,然后触发创建按需发送到数据库的插入,更新和删除语句.

以下是我们将在本章中执行不同操作的域广告上下文类.这是我们在chapater,Database First Approach中创建的相同示例.

上下文类实现

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 Courses { get; set; }      public virtual DbSet Enrollments { get; set; }      public virtual DbSet Students { get; set; }   }}

域类实现

课程类

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();      }      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 Enrollments { get; set; }   }}

学生班级

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();      }      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 Enrollments { get; set; }   }}

报名类

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 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删除实体,请使用Remove方法DbSet.删除现有和新添加的实体的工作.在已添加但尚未保存到数据库的实体上调用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();}

读取操作

从数据库中读取现有数据非常简单.以下是代码,其中检索Student表中的所有数据,然后将按字母顺序显示学生的名字和姓氏.

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();}