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