Учебники

Entity Framework — Операции с базой данных

В предыдущих главах вы узнали о трех разных способах определения модели данных объекта.

  • Два из них, Database First и Model First, зависели от конструктора Entity Framework в сочетании с генерацией кода.

  • Третий, Code First, позволяет вам пропустить визуальный дизайнер и просто написать свой собственный код.

  • Независимо от того, какой путь вы выберете, вы получите классы доменов, и один или несколько классов Entity Framework DbContext позволяют извлекать и сохранять данные, относящиеся к этим классам.

Два из них, Database First и Model First, зависели от конструктора Entity Framework в сочетании с генерацией кода.

Третий, Code First, позволяет вам пропустить визуальный дизайнер и просто написать свой собственный код.

Независимо от того, какой путь вы выберете, вы получите классы доменов, и один или несколько классов Entity Framework DbContext позволяют извлекать и сохранять данные, относящиеся к этим классам.

API-интерфейс DbContext в ваших приложениях используется в качестве моста между вашими классами и вашей базой данных. DbContext является одним из наиболее важных классов в Entity Framework.

  • Это позволяет выражать и выполнять запросы.

  • Он берет результаты запросов из базы данных и преобразует их в экземпляры классов нашей модели.

  • Он может отслеживать изменения в сущностях, включая добавление и удаление, а затем инициирует создание операторов вставки, обновления и удаления, которые отправляются в базу данных по требованию.

Это позволяет выражать и выполнять запросы.

Он берет результаты запросов из базы данных и преобразует их в экземпляры классов нашей модели.

Он может отслеживать изменения в сущностях, включая добавление и удаление, а затем инициирует создание операторов вставки, обновления и удаления, которые отправляются в базу данных по требованию.

Ниже приведены классы контекстной рекламы домена, над которыми мы будем выполнять различные операции в этой главе. Это тот же пример, который мы создали в главе «Первый подход к базам данных».

Реализация класса контекста

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

Реализация классов домена

Курс

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

Студенческий класс

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

Класс зачисления

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 так же просто, как создать новый экземпляр вашего объекта и зарегистрировать его с помощью метода Add в DbSet. Следующий код позволяет добавить нового студента в базу данных.

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. Например, следующий код используется для изменения фамилии Али с Хана на Аслам.

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. В следующем примере приведен код, в котором ученик удаляется из базы данных, имя которой — Али.

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

Операция чтения

Чтение существующих данных из базы данных очень просто. Ниже приведен код, в котором извлекаются все данные из таблицы «Студент», и затем отображается программа с именем и фамилией ученика в алфавитном порядке.