Entity Framework - Operazioni di database
Nei capitoli precedenti sono stati appresi tre diversi modi per definire un modello di dati di entità.
Due di questi, Database First e Model First, dipendevano dal designer di Entity Framework combinato con la generazione del codice.
Il terzo, Code First, ti consente di saltare un visual designer e scrivere semplicemente il tuo codice.
Indipendentemente dal percorso scelto, ti ritroverai con classi di dominio e una o più classi DbContext di Entity Framework ti consentono di recuperare e rendere persistenti i dati rilevanti per tali classi.
L'API DbContext nelle tue applicazioni viene utilizzata come ponte tra le tue classi e il tuo database. DbContext è una delle classi più importanti in Entity Framework.
Consente di esprimere ed eseguire query.
Prende i risultati delle query dal database e li trasforma in istanze delle nostre classi modello.
Può tenere traccia delle modifiche alle entità, inclusa l'aggiunta e l'eliminazione, e quindi attiva la creazione di istruzioni di inserimento, aggiornamento ed eliminazione che vengono inviate al database su richiesta.
Di seguito sono riportate le classi di contesto dell'annuncio di dominio su cui eseguiremo diverse operazioni in questo capitolo. Questo è lo stesso esempio che abbiamo creato nel capitolo, Database First Approach.
Implementazione della classe di contesto
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; }
}
}
Implementazione delle classi di dominio
Classe del corso
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; }
}
}
Classe degli studenti
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; }
}
}
Classe di iscrizione
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; }
}
}
Crea operazione
Aggiungere un nuovo oggetto con Entity Framework è semplice come costruire una nuova istanza del tuo oggetto e registrarlo utilizzando il metodo Add su DbSet. Il codice seguente consente di aggiungere un nuovo studente al database.
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();
}
}
}
Operazione di aggiornamento
Modificare gli oggetti esistenti è semplice come aggiornare il valore assegnato alla proprietà che si desidera modificare e chiamare SaveChanges. Ad esempio, il codice seguente viene utilizzato per modificare il cognome di Ali da Khan ad 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();
}
Elimina operazione
Per eliminare un'entità utilizzando Entity Framework, usa il metodo Remove su DbSet. Rimuovi opere sia per le entità esistenti che per quelle appena aggiunte. La chiamata di Rimuovi su un'entità che è stata aggiunta ma non ancora salvata nel database annullerà l'aggiunta dell'entità. L'entità viene rimossa dal rilevamento delle modifiche e non viene più rilevata da DbContext. La chiamata a Remove su un'entità esistente di cui si tiene traccia delle modifiche registrerà l'entità per l'eliminazione la prossima volta che viene chiamato SaveChanges. L'esempio seguente è di un codice in cui lo studente viene rimosso dal database il cui nome è 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();
}
Leggi operazione
Leggere i dati esistenti dal database è molto semplice. Di seguito è riportato il codice in cui vengono recuperati tutti i dati dalla tabella Studente e quindi verrà visualizzato un programma con il nome e il cognome degli studenti in ordine alfabetico.
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();
}