Entity Framework - Datenbankoperationen

In den vorherigen Kapiteln haben Sie drei verschiedene Methoden zum Definieren eines Entitätsdatenmodells kennengelernt.

  • Zwei davon, Database First und Model First, hingen vom Entity Framework-Designer in Kombination mit der Codegenerierung ab.

  • Mit dem dritten Code First können Sie einen visuellen Designer überspringen und einfach Ihren eigenen Code schreiben.

  • Unabhängig davon, welchen Pfad Sie wählen, erhalten Sie Domänenklassen. Mit einer oder mehreren Entity Framework DbContext-Klassen können Sie Daten abrufen und beibehalten, die für diese Klassen relevant sind.

Die DbContext-API in Ihren Anwendungen wird als Brücke zwischen Ihren Klassen und Ihrer Datenbank verwendet. Der DbContext ist eine der wichtigsten Klassen im Entity Framework.

  • Es ermöglicht das Ausdrücken und Ausführen von Abfragen.

  • Es nimmt Abfrageergebnisse aus der Datenbank und wandelt sie in Instanzen unserer Modellklassen um.

  • Es kann Änderungen an Entitäten verfolgen, einschließlich Hinzufügen und Löschen, und dann die Erstellung von Anweisungen zum Einfügen, Aktualisieren und Löschen auslösen, die bei Bedarf an die Datenbank gesendet werden.

Im Folgenden finden Sie die Kontextklassen für Domain-Anzeigen, für die in diesem Kapitel verschiedene Vorgänge ausgeführt werden. Dies ist das gleiche Beispiel, das wir im Chapater Database First Approach erstellt haben.

Implementierung der Kontextklasse

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

Implementierung von Domänenklassen

Kursklasse

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

Schülerklasse

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

Einschreibungsklasse

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

Operation erstellen

Das Hinzufügen eines neuen Objekts mit Entity Framework ist so einfach wie das Erstellen einer neuen Instanz Ihres Objekts und das Registrieren mit der Add-Methode in DbSet. Mit dem folgenden Code können Sie der Datenbank einen neuen Schüler hinzufügen.

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

Vorgang aktualisieren

Das Ändern vorhandener Objekte ist so einfach wie das Aktualisieren des Werts, der den zu ändernden Eigenschaften zugewiesen wurde, und das Aufrufen von SaveChanges. Der folgende Code wird beispielsweise verwendet, um den Nachnamen von Ali von Khan in Aslam zu ändern.

using (var context = new UniContextEntities()) {

   var student = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
   student.LastName = "Aslam";
   context.SaveChanges();
}

Vorgang löschen

Um eine Entität mit Entity Framework zu löschen, verwenden Sie die Remove-Methode in DbSet. Entfernen Sie Werke für vorhandene und neu hinzugefügte Entitäten. Wenn Sie Entfernen für eine Entität aufrufen, die hinzugefügt, aber noch nicht in der Datenbank gespeichert wurde, wird das Hinzufügen der Entität abgebrochen. Die Entität wird aus dem Änderungs-Tracker entfernt und vom DbContext nicht mehr verfolgt. Wenn Sie Entfernen für eine vorhandene Entität aufrufen, die geändert wird, wird die Entität beim nächsten Aufruf von SaveChanges zum Löschen registriert. Das folgende Beispiel zeigt einen Code, bei dem der Schüler aus der Datenbank entfernt wird, deren Vorname Ali ist.

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

Betrieb lesen

Das Lesen der vorhandenen Daten aus der Datenbank ist sehr einfach. Im Folgenden finden Sie den Code, in dem alle Daten aus der Schülertabelle abgerufen werden. Anschließend wird ein Programm mit dem Vor- und Nachnamen der Schüler in alphabetischer Reihenfolge angezeigt.

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