Condividi tramite


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ò fungere da strumento di mapping relazionale orientato agli oggetti (O/RM) che:

  • Consente agli sviluppatori .NET di operare su 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 contesto dell'oggetto che rappresenta una sessione con il database che consente di eseguire query e salvare i dati. Per altre informazioni, vedere Creazione di un modello.

EF supporta gli approcci di sviluppo di modelli seguenti:

  • Generare un modello da un database esistente.
  • Scrivere manualmente codice per un modello in modo che corrisponda al database.
  • Dopo la creazione di un modello, usare Migrazioni di EF per creare un database dal modello. Le migrazioni consentono l'evoluzione del database man mano che cambia il 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;ConnectRetryCount=0");
    }
}

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 di classi di entità vengono recuperate dal database tramite 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 relative allo strumento di mapping relazionale orientato agli oggetti per EF

Anche se EF Core è utile per astrarre molti dettagli di programmazione, esistono alcune procedure consigliate applicabili a qualsiasi O/RM che consentono di evitare problemi comuni nelle app di produzione:

  • Per progettare, eseguire il debug, profilare ed eseguire la migrazione dei dati nelle app di produzione ad alte prestazioni è necessaria una conoscenza di livello intermedio o superiore del server di database sottostante, ad esempio, la 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 nel modo più accurato possibile per:
    • Individuare i problemi nell'app che si presentano solo quando si usano versioni o edizioni specifiche del server di database.
    • Intercettare le modifiche che causano un'interruzione durante l'aggiornamento di 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 su EF Core in modi imprevisti.
  • Test di prestazioni e di stress con carichi rappresentativi. L'uso semplificato di alcune funzionalità non consente una scalabilità ottimale, ad esempio inclusione di più raccolte, uso elevato del caricamento lazy, query non condizionali su colonne non indicizzate, aggiornamenti di grandi dimensioni e inserimenti con valori generati dall'archivio, mancanza di gestione della concorrenza, modelli di grandi dimensioni e criteri non adeguati per la cache.
  • 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 SQL non elaborato, crittografia per i dati sensibili. Vedere Proteggere i flussi di autenticazione per la configurazione sicura e il flusso di autenticazione.
  • Assicurarsi che la registrazione e la diagnostica siano sufficienti e utilizzabili, ad esempio, la configurazione di registrazione appropriata, i tag di query e Application Insights.
  • Ripristino in seguito a errori. Preparare le contingenze per scenari di errore comuni, ad esempio il rollback delle versioni, i server di fallback, lo scale-out 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 all'avvio dell'applicazione può subire problemi di concorrenza e richiede autorizzazioni superiori rispetto al necessario per il normale funzionamento. Usare la gestione temporanea per facilitare il ripristino da errori irreversibili durante la migrazione. Per altre informazioni, vedere Applicazione di migrazioni.
  • Esame dettagliato e test delle migrazioni generate. Le migrazioni devono essere testate accuratamente prima di essere applicate ai dati di produzione. La forma dello schema e i tipi di colonna non possono essere facilmente modificati quando le tabelle contengono dati di produzione. Ad esempio, in SQL Server nvarchar(max) e decimal(18, 2) sono raramente i tipi migliori per le colonne mappate alle proprietà stringa e decimali, ma queste sono le impostazioni predefinite usate da EF perché non conosce lo scenario specifico.

Passaggi successivi

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