Cos’è Entity Framework?

Entity Framework è un ORM, Object/Relational Mapping framework, ossia è uno strumento che fornisce agli sviluppatori un meccanismo automatico per l’accesso e la memorizzazione dei dati nel database.

Entity Framework è utilizzato in tre scenari:

  1. si dispone già di un database esistente o si vuole progettare il database prima di tutto il resto, così da ottenere le classi in base al database
  2. si vogliono prima creare le classi e in base ad esse costruire il database
  3. si vuole progettare visivamente il database e poi in base ad esso si costruiscono il database e le classi

La figura seguente illustra i tre scenari:

image

 

Cos’è Code First?

Code First è un approccio di utilizzo di Entity Framework che ci permette di concentrarci sulla progettazione del dominio delle classi in quanto grazie ad esse sarà Entity Framework stesso a creare in automatico il database.

In sostanza, noi sviluppatori ci dobbiamo concentrare sulla scrittura delle classi e poi quando si eseguirà per la prima volta il codice, Code First creerà, se già non esiste, il database utilizzando le convenzioni di defalt di Code First. Si possono anche sovrascrivere le convenzioni di default, utilizzando gli attributi DataAnnotation per definire le classi e mapparle con le tabelle del database.

Il flusso base da seguire per utilizzare Entity Framework Code First è il seguente:

  • scrivere il dominio delle classi
  • configurare le classi per il mapping avanzato
  • eseguire l’applicazione con F5
  • code first crea il database e inserisce i dati di default
  • e infine lancia l’applicazione

 

La nostra prima applicazione con Entity Framework Code First

Vediamo un piccolo esempio, assumiamo di voler creare una semplice applicazione per una scuola, in cui gli utenti dovrebbero essere in grado di aggiungere o modificare gli Studenti, le Classi, i Professori e le informazioni del Corso.

Invece di cominciare dalla progettazione delle tabelle del database, cominciamo dalla creazione delle classi del nostro dominio, prima di tutto creiamo un nuovo progetto come mostrato qui, poi ci posizioniamo sulla cartella “Models”

image

e aggiungiamo le due semplici classi che vogliamo creare: “Studente” e “Classe”, in particolare dobbiamo tenere presente che ogni Studente dovrà essere associato ad una classe:

image

    public class Studente
    {
        public Studente()
        { 
        
        }
        public int StudenteId { get; set; }
        public string NomeStudente { get; set; }
        public DateTime DataDiNascita { get; set; }
        public byte[]  Foto { get; set; }
        public decimal Altezza { get; set; }
        public float Peso { get; set; }
        
        public Classe Classe { get; set; }
    }       

La classe “Classe” dovrebbe essere in grado di ospitare più Studenti come mostrato in basso.

    public class Classe
    {
        public Classe()
        { 
        
        }
        public int ClasseId { get; set; }
        public string NomeClasse { get; set; }
    
        public ICollection<Studente> Studenti { get; set; }
   
     }
A questo punto a Code First per funzionare occorre un’altra classe che gli definisca il contesto in cui operare, ossia le classi che devono essere mappate con il database. Questa classe deve ereditare dalla classe base DbContext, e deve esporre la proprietà DbSet per tutti i tipi che si vuole inserire nel modello, nel nostro caso “Studente” e “Classe”. Per aggiungere la classe ci posizioniamo sulla Classe Controllers e aggiungiamo un nuovo Controller come mostrato in basso:
image[12]

image

Nella voce Classe modello selezioniamo la nostra classe Studente, poi clicchiamo sul + per l’aggiunta della classe di Contesto, che rinominiamo in ScContext

image

image

image

Dopo, compiliamo la soluzione e ripetiamo l’operazione per aggiungere anche il controller della classe “Classe”

image

A questo punto nella nostra soluzione saranno state create in automatico 3 classi, 2 all’interno della cartella “Controllers”, che ci serviranno per gestire le azioni da eseguire con le relative risorse e una nella classe “Models” che indica il Contesto in cui deve agire Entity Framework, ossia quali classi dovranno essere utilizzate per la creazione e successiva gestione del database.

image

 

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace MyWebApi.Models
{
    public class ScuolaContext : DbContext
    {
        // You can add custom code to this file. Changes will not be overwritten.
        // 
        // If you want Entity Framework to drop and regenerate your database
        // automatically whenever you change your model schema, please use data migrations.
        // For more information refer to the documentation:
        // http://msdn.microsoft.com/en-us/data/jj591621.aspx
    
        public ScuolaContext() : base("name=ScuolaContext")
        {
        }

        public System.Data.Entity.DbSet<MyWebApi.Models.Studente> Student { get; set; }

        public System.Data.Entity.DbSet<MyWebApi.Models.Classe> Classi { get; set; }
    }
}

A questo punto non ci resta che vedere come inserire dei valori di default nelle tabelle Classe e Studente.

Dal menù Strumenti selezioniamo Gestione pacchetti NuGet e poi Console Gestione Pacchetti

image

Nella schermata che compare scriviamo il seguente codice: “Enable-Migrations –ContextTypeName MyWebApi.Models.ScuolaContext”

image

Grazie a questo comando Code First, capisce che deve abilitare la migrazione (vedremo meglio cosa è la migrazione nelle prossime sessioni) e aggiunge una nuova cartella “Migrations” nella soluzione.

All’interno di questa nuova cartella vi è la classe Configuration che espone il metodo Seed, e al suo interno possiamo inserire il codice necessario per aggiungere dei valori di defualt:

namespace MyWebApi.Migrations
{
    using Models;
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<MyWebApi.Models.ScuolaContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(MyWebApi.Models.ScuolaContext context)
        {
            
       }
    }
}

Ora è tutto pronto non ci resta che dire a Code First di procedere con la creazione del database, e per far ciò utilizziamo il comando: Add-Migration seguito dal nome del Db ad esempio ScuolaDb e poi il comando Update-Database

image

A questo punto nella schermata “Esplora Server” compare il nuovo database:

image

In questa prima parte del tutorial abbiamo visto come interagire con Entity Framework Code First, nella prossima invece vedremo più in profondità come funziona Code First e come personalizzare le classi.

Autore:


blog comments powered by Disqus