В предыдущих главах вы узнали о трех разных способах определения модели данных объекта.
-
Два из них, 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(); }
Операция чтения
Чтение существующих данных из базы данных очень просто. Ниже приведен код, в котором извлекаются все данные из таблицы «Студент», и затем отображается программа с именем и фамилией ученика в алфавитном порядке.