Share via


Parte 5, usare un database in un'app MVC core ASP.NET

Nota

Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 8 di questo articolo.

Importante

Queste informazioni si riferiscono a un prodotto non definitive che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

Per la versione corrente, vedere la versione .NET 8 di questo articolo.

Di Rick Anderson e Jon P Smith.

L'oggetto MvcMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Il contesto del database viene registrato con il contenitore Dependency Injection nel Program.cs file:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

Il sistema di configurazione principale ASP.NET legge la ConnectionString chiave. Per lo sviluppo locale, ottiene il stringa di connessione dal appsettings.json file :

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

Quando l'app viene distribuita in un server di test o produzione, è possibile usare una variabile di ambiente per impostare la stringa di connessione su un'istanza di SQL Server di produzione. Per altre informazioni, vedere Configurazione.

SQL Server Express LocalDB

Local DB:

  • Versione leggera del motore di database SQL Server Express, installata per impostazione predefinita con Visual Studio.
  • Inizia su richiesta usando un stringa di connessione.
  • È destinato allo sviluppo del programma. Viene eseguito in modalità utente, quindi non esiste una configurazione complessa.
  • Per impostazione predefinita, crea .mdf file nella directory C:/Users/{user}.

Esaminare il database

Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).

Fare clic con il pulsante destro del mouse sulla Movie tabella (dbo.Movie) > Progettazione viste

Fare clic con il pulsante destro del mouse su Progettazione viste tabella > film.

Tabella Movie aperta nella finestra di progettazione

Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, EF crea una proprietà denominata ID chiave primaria.

Fare clic con il pulsante destro del mouse sulla Movie tabella > Visualizza dati

Fare clic con il pulsante destro del mouse sulla tabella > Movie View Data (Visualizza dati).

Tabella Movie aperta con i dati della tabella

Specificare il valore di inizializzazione del database

Creare una nuova classe denominata SeedData nella cartella Models. Sostituire il codice generato con il seguente:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // Look for any movies.
            if (context.Movie.Any())
            {
                return;   // DB has been seeded
            }
            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    Genre = "Romantic Comedy",
                    Price = 7.99M
                },
                new Movie
                {
                    Title = "Ghostbusters ",
                    ReleaseDate = DateTime.Parse("1984-3-13"),
                    Genre = "Comedy",
                    Price = 8.99M
                },
                new Movie
                {
                    Title = "Ghostbusters 2",
                    ReleaseDate = DateTime.Parse("1986-2-23"),
                    Genre = "Comedy",
                    Price = 9.99M
                },
                new Movie
                {
                    Title = "Rio Bravo",
                    ReleaseDate = DateTime.Parse("1959-4-15"),
                    Genre = "Western",
                    Price = 3.99M
                }
            );
            context.SaveChanges();
        }
    }
}

Se nel database sono presenti film, l'inizializzatore di inizializzazione di inizializzazione restituisce e non vengono aggiunti film.

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

Aggiungere l'inizializzatore del valore di inizializzazione

Sostituire il contenuto di Program.cs con il codice seguente. Il nuovo codice è evidenziato.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Eliminare tutti i record nel database. È possibile eseguire questa operazione con i collegamenti di eliminazione nel browser o da SSOX.

Test dell'app. Forzare l'inizializzazione dell'app, chiamando il codice nel Program.cs file, in modo che venga eseguito il metodo di inizializzazione. Per forzare l'inizializzazione, chiudere la finestra del prompt dei comandi aperta da Visual Studio e riavviare premendo CTRL+F5.

L'app mostra i dati inizializzati.

App Movie MVC aperta in Microsoft Edge che mostra i dati dei film

L'oggetto MvcMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Il contesto del database viene registrato con il contenitore Dependency Injection nel Program.cs file:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

Il sistema di configurazione principale ASP.NET legge la ConnectionString chiave. Per lo sviluppo locale, ottiene il stringa di connessione dal appsettings.json file :

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

Quando l'app viene distribuita in un server di test o produzione, è possibile usare una variabile di ambiente per impostare la stringa di connessione su un'istanza di SQL Server di produzione. Per altre informazioni, vedere Configurazione.

SQL Server Express LocalDB

Local DB:

  • Versione leggera del motore di database SQL Server Express, installata per impostazione predefinita con Visual Studio.
  • Inizia su richiesta usando un stringa di connessione.
  • È destinato allo sviluppo del programma. Viene eseguito in modalità utente, quindi non esiste una configurazione complessa.
  • Per impostazione predefinita, crea .mdf file nella directory C:/Users/{user}.

Esaminare il database

Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).

Fare clic con il pulsante destro del mouse sulla Movie tabella (dbo.Movie) > Progettazione viste

Fare clic con il pulsante destro del mouse su Progettazione viste tabella > film.

Tabella Movie aperta nella finestra di progettazione

Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, EF crea una proprietà denominata ID chiave primaria.

Fare clic con il pulsante destro del mouse sulla Movie tabella > Visualizza dati

Fare clic con il pulsante destro del mouse sulla tabella > Movie View Data (Visualizza dati).

Tabella Movie aperta con i dati della tabella

Specificare il valore di inizializzazione del database

Creare una nuova classe denominata SeedData nella cartella Models. Sostituire il codice generato con il seguente:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // Look for any movies.
            if (context.Movie.Any())
            {
                return;   // DB has been seeded
            }
            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    Genre = "Romantic Comedy",
                    Price = 7.99M
                },
                new Movie
                {
                    Title = "Ghostbusters ",
                    ReleaseDate = DateTime.Parse("1984-3-13"),
                    Genre = "Comedy",
                    Price = 8.99M
                },
                new Movie
                {
                    Title = "Ghostbusters 2",
                    ReleaseDate = DateTime.Parse("1986-2-23"),
                    Genre = "Comedy",
                    Price = 9.99M
                },
                new Movie
                {
                    Title = "Rio Bravo",
                    ReleaseDate = DateTime.Parse("1959-4-15"),
                    Genre = "Western",
                    Price = 3.99M
                }
            );
            context.SaveChanges();
        }
    }
}

Se nel database sono presenti film, l'inizializzatore di inizializzazione di inizializzazione restituisce e non vengono aggiunti film.

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

<a name=snippet_"si">

Aggiungere l'inizializzatore del valore di inizializzazione

Sostituire il contenuto di Program.cs con il codice seguente. Il nuovo codice è evidenziato.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Eliminare tutti i record nel database. È possibile eseguire questa operazione con i collegamenti di eliminazione nel browser o da SSOX.

Test dell'app. Forzare l'inizializzazione dell'app, chiamando il codice nel Program.cs file, in modo che venga eseguito il metodo di inizializzazione. Per forzare l'inizializzazione, chiudere la finestra del prompt dei comandi aperta da Visual Studio e riavviare premendo CTRL+F5.

L'app mostra i dati inizializzati.

App Movie MVC aperta in Microsoft Edge che mostra i dati dei film

L'oggetto MvcMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Il contesto del database viene registrato con il contenitore Dependency Injection nel Program.cs file:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

Il sistema di configurazione principale ASP.NET legge la ConnectionString chiave. Per lo sviluppo locale, ottiene il stringa di connessione dal appsettings.json file :

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Quando l'app viene distribuita in un server di test o produzione, è possibile usare una variabile di ambiente per impostare la stringa di connessione su un'istanza di SQL Server di produzione. Per altre informazioni, vedere Configurazione.

SQL Server Express LocalDB

Local DB:

  • Versione leggera del motore di database SQL Server Express, installata per impostazione predefinita con Visual Studio.
  • Inizia su richiesta usando un stringa di connessione.
  • È destinato allo sviluppo del programma. Viene eseguito in modalità utente, quindi non esiste una configurazione complessa.
  • Per impostazione predefinita, crea .mdf file nella directory C:/Users/{user}.

Specificare il valore di inizializzazione del database

Creare una nuova classe denominata SeedData nella cartella Models. Sostituire il codice generato con il seguente:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

Se nel database sono presenti film, l'inizializzatore di inizializzazione di inizializzazione restituisce e non vengono aggiunti film.

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

Aggiungere l'inizializzatore del valore di inizializzazione

Sostituire il contenuto di Program.cs con il codice seguente. Il nuovo codice è evidenziato.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Eliminare tutti i record nel database. È possibile eseguire questa operazione con i collegamenti di eliminazione nel browser o da SSOX.

Test dell'app. Forzare l'inizializzazione dell'app, chiamando il codice nel Program.cs file, in modo che venga eseguito il metodo di inizializzazione. Per forzare l'inizializzazione, chiudere la finestra del prompt dei comandi aperta da Visual Studio e riavviare premendo CTRL+F5.

L'app mostra i dati inizializzati.

App Movie MVC aperta in Microsoft Edge che mostra i dati dei film

L'oggetto MvcMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Il contesto del database viene registrato con il contenitore Dependency Injection nel ConfigureServices metodo nel Startup.cs file :

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}

Il sistema di configurazione principale ASP.NET legge la ConnectionString chiave. Per lo sviluppo locale, ottiene il stringa di connessione dal appsettings.json file :

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Quando l'app viene distribuita in un server di test o produzione, è possibile usare una variabile di ambiente per impostare la stringa di connessione su un'istanza di SQL Server di produzione. Per altre informazioni, vedere Configurazione.

SQL Server Express LocalDB

Local DB:

  • Versione leggera del motore di database SQL Server Express, installata per impostazione predefinita con Visual Studio.
  • Inizia su richiesta usando un stringa di connessione.
  • È destinato allo sviluppo del programma. Viene eseguito in modalità utente, quindi non esiste una configurazione complessa.
  • Per impostazione predefinita, crea .mdf file nella directory C:/Users/{user}.

Esaminare il database

Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).

Menu Visualizza

Fare clic con il pulsante destro del Movie mouse su Progettazione viste tabella >

Fare clic con il pulsante destro del mouse su Progettazione vista tabella > film

Tabella Movie aperta nella finestra di progettazione

Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, EF crea una proprietà denominata ID chiave primaria.

Fare clic con il pulsante destro del mouse sulla Movie tabella > Visualizza dati

Fare clic con il pulsante destro del mouse sulla tabella > Movie View Data

Tabella Movie aperta con i dati della tabella

Specificare il valore di inizializzazione del database

Creare una nuova classe denominata SeedData nella cartella Models. Sostituire il codice generato con il seguente:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

Se nel database sono presenti film, l'inizializzatore di inizializzazione di inizializzazione restituisce e non vengono aggiunti film.

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

Aggiungere l'inizializzatore del valore di inizializzazione

Sostituire il contenuto di Program.cs con il codice seguente:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MvcMovie.Data;
using MvcMovie.Models;
using System;

namespace MvcMovie
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    SeedData.Initialize(services);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred seeding the DB.");
                }
            }

            host.Run();

        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

Test dell'app.

Eliminare tutti i record nel database. È possibile eseguire questa operazione con i collegamenti di eliminazione nel browser o da SSOX.

Forzare l'inizializzazione dell'app, chiamando i metodi nella Startup classe , in modo che venga eseguito il metodo di inizializzazione. Per forzare l'inizializzazione, IIS Express deve essere arrestato e riavviato. È possibile eseguire questa operazione adottando uno degli approcci seguenti:

  • Fare clic con il pulsante destro del mouse sull'icona dell'area di notifica di IIS Express e toccare Esci o Arresta sito:

    Icona dell'area di notifica di IIS Express

    Menu di scelta rapida

    • Se Visual Studio è in esecuzione in modalità non di debug, premere F5 per attivare la modalità di debug
    • Se Visual Studio è in esecuzione in modalità di debug, arrestare il debugger e premere F5

L'app mostra i dati inizializzati.

App Movie MVC aperta in Microsoft Edge che mostra i dati dei film