Entity Framework - operacje na bazach danych

W poprzednich rozdziałach poznałeś trzy różne sposoby definiowania modelu danych encji.

  • Dwa z nich, Database First i Model First, zależały od projektanta Entity Framework w połączeniu z generowaniem kodu.

  • Trzecia, Code First, pozwala pominąć projektanta wizualnego i po prostu napisać własny kod.

  • Bez względu na wybraną ścieżkę otrzymasz klasy domeny, a co najmniej jedna klasa Entity Framework DbContext umożliwia pobieranie i utrwalanie danych odpowiednich dla tych klas.

Interfejs API DbContext w aplikacjach jest używany jako pomost między klasami a bazą danych. DbContext jest jedną z najważniejszych klas w Entity Framework.

  • Umożliwia wyrażanie i wykonywanie zapytań.

  • Pobiera wyniki zapytań z bazy danych i przekształca je w wystąpienia naszych klas modelu.

  • Może śledzić zmiany w jednostkach, w tym dodawać i usuwać, a następnie wyzwala tworzenie instrukcji wstawiania, aktualizowania i usuwania, które są wysyłane do bazy danych na żądanie.

Poniżej znajdują się klasy kontekstu reklamy domeny, na których będziemy wykonywać różne operacje w tym rozdziale. To jest ten sam przykład, który stworzyliśmy w rozdziale „Pierwsze podejście do bazy danych”.

Implementacja klasy kontekstu

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

Implementacja klas domeny

Klasa kursu

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

Klasa studencka

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

Zajęcia rekrutacyjne

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

Utwórz operację

Dodanie nowego obiektu za pomocą Entity Framework jest tak proste, jak skonstruowanie nowego wystąpienia obiektu i zarejestrowanie go przy użyciu metody Add w DbSet. Poniższy kod umożliwia dodanie nowego ucznia do bazy danych.

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

Operacja aktualizacji

Zmiana istniejących obiektów jest tak prosta, jak zaktualizowanie wartości przypisanej do właściwości, które chcesz zmienić, i wywołanie SaveChanges. Na przykład poniższy kod służy do zmiany nazwiska Ali z Khan na 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();
}

Usuń operację

Aby usunąć jednostkę przy użyciu Entity Framework, użyj metody Remove w DbSet. Usuń prace zarówno dla istniejących, jak i nowo dodanych jednostek. Wywołanie funkcji Usuń dla jednostki, która została dodana, ale nie została jeszcze zapisana w bazie danych, spowoduje anulowanie dodania jednostki. Jednostka jest usuwana z modułu do śledzenia zmian i nie jest już śledzona przez DbContext. Wywołanie Remove na istniejącej encji, która jest śledzona zmian, spowoduje zarejestrowanie jednostki do usunięcia przy następnym wywołaniu SaveChanges. Poniższy przykład przedstawia kod, w którym uczeń jest usuwany z bazy danych o imieniu 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();
}

Przeczytaj operację

Odczyt istniejących danych z bazy danych jest bardzo prosty. Poniżej znajduje się kod, w którym pobierane są wszystkie dane z tabeli Studentów, a następnie program zostanie wyświetlony z imieniem i nazwiskiem uczniów w kolejności alfabetycznej.

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