Entity Framework Core

Entity Framework (EF) Core è una versione semplice, estendibile, open source e multipiattaforma della tecnologia di accesso ai dati di grande diffusione Entity Framework.

EF Core può essere utilizzato come mapper relazionale a oggetti (O/RM), che:

  • Consente agli sviluppatori .NET di usare un database usando oggetti .NET.
  • Elimina la necessità della maggior parte del codice di accesso ai dati che in genere deve essere scritto.

EF Core supporta molti motori di database. Per informazioni dettagliate, vedere Provider di Database.

Il modello

Con Entity Framework Core, l'accesso ai dati viene eseguito tramite un modello. Un modello è costituito da classi di entità e da un oggetto contesto che rappresenta una sessione con il database. L'oggetto contesto consente l'esecuzione di query e il salvataggio dei dati. Per altre informazioni, vedere Creazione di un modello.

EF supporta gli approcci di sviluppo del modello seguenti:

  • Generare un modello da un database esistente.
  • Codificare manualmente un modello in modo che corrisponda al database.
  • Dopo aver creato un modello, usare Migrazioni di EF per creare un database dal modello. Le migrazioni consentono l'evoluzione del database in base alle modifiche del modello.
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;

namespace Intro;

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public int Rating { get; set; }
    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

Query

Le istanze delle classi di entità vengono recuperate dal database usando LINQ (Language Integrated Query). Per altre informazioni, vedere Esecuzione di query sui dati.

using (var db = new BloggingContext())
{
    var blogs = db.Blogs
        .Where(b => b.Rating > 3)
        .OrderBy(b => b.Url)
        .ToList();
}

Salvataggio dei dati

I dati vengano creati, eliminati e modificati nel database tramite le istanze di classi di entità. Per altre informazioni, vedere Salvataggio di dati.

using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    db.Blogs.Add(blog);
    db.SaveChanges();
}

Considerazioni su O/RM di EF

Sebbene EF Core sia in grado di astrarre molti dettagli di programmazione, esistono alcune procedure consigliate applicabili a qualsiasi O/RM che consentono di evitare problemi comuni nelle app di produzione:

  • Le conoscenze di livello intermedio o superiori del server di database sottostante sono essenziali per l'architettura, il debug, la profila e la migrazione dei dati nelle app di produzione ad alte prestazioni. Ad esempio, conoscenza di chiavi primarie ed esterne, vincoli, indici, normalizzazione, istruzioni DML e DDL, tipi di dati, profilatura e così via.
  • Test funzionali e di integrazione: è importante replicare l'ambiente di produzione il più possibile per:
    • Individuare i problemi nell'app che vengono visualizzati solo quando si usa una versione o un'edizione specifica del server di database.
    • Rilevare le modifiche di rilievo durante EF Core e altre dipendenze. Ad esempio, l'aggiunta o l'aggiornamento di framework come ASP.NET Core, OData o AutoMapper. Queste dipendenze possono influire sulle EF Core in modi imprevisti.
  • Test di prestazioni e stress con carichi rappresentativi. L'uso ingenuo di alcune funzionalità non è ridimensionabile in modo bile. Ad esempio, più raccolte Include, uso elevato del caricamento lazy, query condizionali su colonne non indicizzate, aggiornamenti e inserimenti di grandi dimensioni con valori generati dall'archivio, mancanza di gestione della concorrenza, modelli di grandi dimensioni, criteri di cache non adeguati.
  • Verifica della sicurezza: ad esempio, gestione delle stringhe di connessione e di altri segreti, autorizzazioni del database per operazioni non di distribuzione, convalida dell'input per i dati SQL non elaborati, crittografia per dati sensibili.
  • Assicurarsi che la registrazione e la diagnostica siano sufficienti e utilizzabili. Ad esempio, la configurazione di registrazione appropriata, i tag di query e l'applicazione Insights.
  • Ripristino degli errori. Preparare le emergenze per scenari di errore comuni, ad esempio il rollback della versione, i server di fallback, la scalabilità orizzontale e il bilanciamento del carico, la mitigazione DoS e i backup dei dati.
  • Distribuzione e migrazione delle applicazioni. Pianificare la modalità di applicazione delle migrazioni durante la distribuzione. L'esecuzione di questa operazione all'avvio dell'applicazione può risentire di problemi di concorrenza e richiede autorizzazioni superiori a quelle necessarie per il normale funzionamento. Usare la gestione temporanea per facilitare il ripristino da errori irreversibili durante la migrazione. Per altre informazioni, vedere Applicazione delle migrazioni.
  • Analisi dettagliata e test delle migrazioni generate. Le migrazioni devono essere testate accuratamente prima di essere applicate ai dati di produzione. La forma dello schema e dei tipi di colonna non può essere modificata facilmente quando le tabelle contengono dati di produzione. Ad esempio, in SQL Server nvarchar(max)decimal(18, 2) e sono raramente i tipi migliori per le colonne di cui viene eseguito il mapping alle proprietà stringa e decimale, ma queste sono le impostazioni predefinite che EF usa perché non ha una conoscenza dello scenario specifico.

Passaggi successivi

Per le esercitazioni introduttive, vedere Introduzione a Entity Framework Core.