Condividi tramite


Uso dei dati

Suggerimento

Questo contenuto è un estratto dell'eBook, Blazor per gli sviluppatori di Web Forms ASP.NET per Azure, disponibile in .NET Docs o come PDF scaricabile gratuitamente che può essere letto offline.

Anteprima della copertina dell'eBook Blazor-for-ASP-NET-Web-Forms-Developers.

L'accesso ai dati è la spina dorsale di un'app Web Form ASP.NET. Se si creano moduli per il Web, cosa accade a tali dati? Con Web Form sono disponibili più tecniche di accesso ai dati che è possibile usare per interagire con un database:

  • Origini dati
  • ADO.NET
  • Entity Framework

Origini dei dati erano controlli che potevi inserire in una pagina Web Forms e configurare come altri controlli. Visual Studio ha fornito un set intuitivo di finestre di dialogo per configurare e associare i controlli alle pagine dei moduli Web. Gli sviluppatori che godono di un approccio "low code" o "no code" hanno preferito questa tecnica quando Web Form è stato rilasciato per la prima volta.

Origini dati

ADO.NET è l'approccio di basso livello per interagire con un database. Le app possono creare una connessione al database con comandi, tabelle dati e set di dati per l'interazione. I risultati potrebbero quindi essere associati a campi sullo schermo senza molto codice. Lo svantaggio di questo approccio era che ogni set di oggetti ADO.NET (Connection, Commande DataTable) era associato alle librerie fornite da un fornitore di database. L'uso di questi componenti rende il codice rigido e difficile da migrare a un database diverso.

Entity Framework

Entity Framework (EF) è il framework di mapping relazionale a oggetti open source gestito da .NET Foundation. Inizialmente rilasciato con .NET Framework, EF consente di generare codice per le connessioni al database, gli schemi di archiviazione e le interazioni. Con questa astrazione, è possibile concentrarsi sulle regole business dell'app e consentire la gestione del database da parte di un amministratore di database attendibile. In .NET è possibile usare una versione aggiornata di ENTITY denominata EF Core. EF Core consente di generare e gestire le interazioni tra il codice e il database con una serie di comandi disponibili per l'utente usando lo strumento da dotnet ef riga di comando. Verranno ora esaminati alcuni esempi per iniziare a usare un database.

EF Code First

Un modo rapido per iniziare a creare le interazioni con il database consiste nell'iniziare con gli oggetti classe con cui si vuole lavorare. Ef fornisce uno strumento per generare il codice di database appropriato per le classi. Questo approccio è denominato sviluppo "Code First". Si consideri la classe seguente Product per un'app storefront di esempio che si vuole archiviare in un database relazionale come Microsoft SQL Server.

public class Product
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [MaxLength(4000)]
    public string Description { get; set; }

    [Range(0, 99999,99)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }
}

Il prodotto ha una chiave primaria e tre campi aggiuntivi che verrebbero creati nel database:

  • Entity Framework identificherà la Id proprietà come chiave primaria per convenzione.
  • Name verrà archiviato in una colonna configurata per l'archiviazione del testo. L'attributo [Required] che decora questa proprietà aggiungerà un not null vincolo per applicare questo comportamento dichiarato della proprietà.
  • Description verrà archiviato in una colonna configurata per l'archiviazione del testo e avrà una lunghezza massima configurata di 4000 caratteri in base all'attributo [MaxLength] . Lo schema del database verrà configurato con una colonna denominata MaxLength usando il tipo di varchar(4000)dati .
  • La Price proprietà verrà archiviata come valuta. L'attributo [Range] genererà vincoli appropriati per impedire l'archiviazione dei dati al di fuori dei valori minimi e massimi dichiarati.

È necessario aggiungere questa Product classe a una classe di contesto del database che definisce le operazioni di connessione e conversione con il database.

public class MyDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

La MyDbContext classe fornisce la proprietà che definisce l'accesso e la traduzione per la Product classe . L'applicazione configura questa classe per l'interazione con il database usando le voci seguenti nel Startup metodo della ConfigureServices classe (o il percorso appropriato in Program.cs usando la builder.Services proprietà anziché services):

services.AddDbContext<MyDbContext>(options =>
    options.UseSqlServer("MY DATABASE CONNECTION STRING"));

Il codice precedente si connetterà a un database di SQL Server con la stringa di connessione specificata. È possibile inserire la stringa di connessione nel file diappsettings.json , nelle variabili di ambiente o in altri percorsi di archiviazione della configurazione e sostituire questa stringa incorporata in modo appropriato.

È quindi possibile generare la tabella di database appropriata per questa classe usando i comandi seguenti:

dotnet ef migrations add 'Create Product table'
dotnet ef database update

Il primo comando definisce le modifiche apportate allo schema del database come nuova migrazione di Entity Framework denominata Create Product table. Una migrazione definisce come applicare e rimuovere le modifiche al nuovo database.

Dopo l'applicazione, è presente una tabella semplice Product nel database e alcune nuove classi aggiunte al progetto che consentono di gestire lo schema del database. Per impostazione predefinita, è possibile trovare queste classi generate in una nuova cartella denominata Migrazioni. Quando si apportano modifiche alla Product classe o si aggiungono altre classi correlate che si vuole interagire con il database, è necessario eseguire di nuovo i comandi della riga di comando con un nuovo nome della migrazione. Questo comando genererà un altro set di classi di migrazione per aggiornare lo schema del database.

EF Database First

Per i database esistenti, è possibile generare le classi per EF Core usando gli strumenti da riga di comando .NET. Per eseguire lo scaffolding delle classi, utilizza una variante del comando seguente:

dotnet ef dbcontext scaffold "CONNECTION STRING" Microsoft.EntityFrameworkCore.SqlServer -c MyDbContext -t Product -t Customer

Il comando precedente si connette al database usando la stringa di connessione e il Microsoft.EntityFrameworkCore.SqlServer provider specificati. Dopo la connessione, viene creata una classe di contesto del database denominata MyDbContext . Vengono inoltre create classi di supporto per le Product tabelle e Customer specificate con le -t opzioni . Per questo comando sono disponibili molte opzioni di configurazione per generare la gerarchia di classi appropriata per il database. Per informazioni di riferimento complete, vedere la documentazione del comando.

Altre informazioni su EF Core sono disponibili nel sito Microsoft Docs.

Interagire con servizi Web

Quando ASP.NET è stato rilasciato per la prima volta, i servizi SOAP erano il modo preferito per i server Web e i client per lo scambio di dati. Molto è cambiato da quel momento, e le interazioni preferite con i servizi sono state spostate per indirizzare le interazioni dei client HTTP. Con ASP.NET Core e Blazor, è possibile registrare la configurazione di HttpClient in Program.cs o nel Startup metodo della ConfigureServices classe. Usare questa configurazione quando è necessario interagire con l'endpoint HTTP. Prendere in considerazione il codice di configurazione seguente:

// in Program.cs
builder.Services.AddHttpClient("github", client =>
{
    client.BaseAddress = new Uri("http://api.github.com/");
    // GitHub API versioning
    client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    // GitHub requires a user-agent
    client.DefaultRequestHeaders.Add("User-Agent", "BlazorWebForms-Sample");
});

Ogni volta che è necessario accedere ai dati da GitHub, creare un client con il nome github. Il client viene configurato con l'indirizzo di base e le intestazioni della richiesta vengono impostate in modo appropriato. Inserisci IHttpClientFactory nei componenti Blazor utilizzando la direttiva @inject o un attributo [Inject] su una proprietà. Crea il client specifico e interagisci con i servizi utilizzando la sintassi seguente:

@inject IHttpClientFactory factory

...

@code {
    protected override async Task OnInitializedAsync()
    {
        var client = factory.CreateClient("github");
        var response = await client.GetAsync("repos/dotnet/docs/issues");
        response.EnsureStatusCode();
        var content = await response.Content.ReadAsStringAsync();
    }
}

Questo metodo restituisce la stringa che descrive la raccolta di problemi nel repository GitHub dotnet/docs . Restituisce il contenuto in formato JSON e viene deserializzato in oggetti di problema GitHub appropriati. Esistono molti modi per configurare il HttpClientFactory per fornire oggetti preconfigurati HttpClient. Provare a configurare più HttpClient istanze con nomi ed endpoint diversi per i vari servizi Web usati. Questo approccio renderà le interazioni con questi servizi più facili da usare in ogni pagina. Per altre informazioni, vedere Effettuare richieste HTTP con IHttpClientFactory.