Partilhar via


Parte 5, trabalhar com um banco de dados em um aplicativo MVC ASP.NET Core

Observação

Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.

Advertência

Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.

Importante

Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.

Para a versão atual, consulte a versão .NET 9 deste artigo.

Por Rick Anderson e Jon P Smith.

O objeto MvcMovieContext lida com a tarefa de se conectar à base de dados e mapear objetos Movie para registos de base de dados. O contexto da base de dados está registado no container Dependency Injection no ficheiro Program.cs.

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));

O sistema ASP.NET Core Configuration lê a chave ConnectionString. Para desenvolvimento local, ele obtém a cadeia de conexão do arquivo appsettings.json:

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-4ebefa10-de29-4dea-b2ad-8a8dc6bcf374;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Advertência

Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.

SQL Server Express LocalDB

LocalDB:

  • É uma versão leve do Mecanismo de Banco de Dados do SQL Server Express, instalado por padrão com o Visual Studio.
  • Inicia sob demanda usando uma cadeia de conexão.
  • Está direcionado para o desenvolvimento de programas. Ele é executado no modo de usuário, portanto, não há nenhuma configuração complexa.
  • Por padrão, cria arquivos .mdf no diretório C:/Users/{user}.

Examinar o banco de dados

No menu Exibir, abra o Pesquisador de Objetos do SQL Server (SSOX).

Clique com o botão direito do rato na tabela Movie (dbo.Movie) > View Designer

Clique com o botão direito do rato na tabela de filmes > Ver o Designer.

tabela de filmes aberta no Designer

Observe o ícone de chave ao lado de ID. Por padrão, o EF cria uma propriedade chamada ID chave primária.

Clique com o botão direito do rato na tabela Movie> Ver Dados

Clique com o botão direito do rato na tabela dos Filmes > Ver Dados.

Tabela de filmes aberta mostrando dados da tabela

Semear o banco de dados

Crie uma nova classe chamada SeedData na pasta Models. Substitua o código gerado pelo seguinte:

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 houver algum filme no banco de dados, o inicializador de semente retornará e nenhum filme será adicionado.

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

Adicionar o inicializador de semente

Substitua o conteúdo do Program.cs pelo código a seguir. O novo código é destacado.

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") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));

// 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.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();

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

app.Run();

Exclua todos os registros no banco de dados. Você pode fazer isso com os links de exclusão no navegador ou do SSOX.

Teste o aplicativo. Força o aplicativo a inicializar, chamando o código no arquivo Program.cs, para que o método seed seja executado. Para forçar a inicialização, feche a janela do prompt de comando que o Visual Studio abriu e reinicie pressionando Ctrl+F5.

A aplicação mostra os dados pré-definidos.

aplicação MVC Movie aberta no Microsoft Edge mostrando dados do filme

O objeto MvcMovieContext trata da tarefa de ligar-se à base de dados e mapear objetos Movie para registos na base de dados. O contexto do banco de dados é registrado com o contêiner Dependency Injection no arquivo Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

O sistema ASP.NET Core Configuration lê a chave ConnectionString. Para desenvolvimento local, ele obtém a cadeia de conexão do arquivo appsettings.json:

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

Advertência

Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.

SQL Server Express LocalDB

LocalDB:

  • É uma versão leve do Mecanismo de Banco de Dados do SQL Server Express, instalado por padrão com o Visual Studio.
  • Inicia sob demanda usando uma string de conexão.
  • É direcionado para o desenvolvimento de programas. Ele é executado no modo de usuário, portanto, não há nenhuma configuração complexa.
  • Por padrão, cria arquivos .mdf no diretório C:/Users/{user}.

Examinar o banco de dados

No menu Ver, abra o Explorador de Objetos do SQL Server (SSOX).

Clique com o botão direito do rato na tabela Movie (dbo.Movie) > View Designer

Clique com o botão direito do rato na tabela Filme > Visualizar Designer.

Tabela de Filmes aberta no Designer

Observe o ícone de chave ao lado de ID. Por padrão, o EF cria uma propriedade chamada ID chave primária.

Clique com o botão direito do rato na tabela Movie> Ver Dados

Clique com o botão direito do rato na tabela de Filmes > Ver Dados.

Tabela de filmes aberta mostrando dados da tabela

Semear o banco de dados

Crie uma nova classe chamada SeedData na pasta Models. Substitua o código gerado pelo seguinte:

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 houver algum filme no banco de dados, o inicializador de semente retornará e nenhum filme será adicionado.

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

Adicionar o inicializador de semente

Substitua o conteúdo do Program.cs pelo código a seguir. O novo código é destacado.

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();

Exclua todos os registros no banco de dados. Você pode fazer isso com os links de exclusão no navegador ou do SSOX.

Teste o aplicativo. Força a aplicação a inicializar, chamando o código no arquivo Program.cs, para que o método seed seja executado. Para forçar a inicialização, feche a janela do prompt de comando que o Visual Studio abriu e reinicie pressionando Ctrl+F5.

A aplicação mostra os dados inseridos.

aplicativo MVC Movie aberto no Microsoft Edge mostrando dados de filme

O objeto MvcMovieContext realiza a tarefa de se conectar à base de dados e mapear objetos Movie para registos de base de dados. O contexto do banco de dados é registrado com o contêiner Dependency Injection no arquivo Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

O sistema ASP.NET Core Configuration lê a chave ConnectionString. Para desenvolvimento local, ele obtém a cadeia de conexão do arquivo appsettings.json:

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

Advertência

Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.

SQL Server Express LocalDB

LocalDB:

  • É uma versão leve do Mecanismo de Banco de Dados do SQL Server Express, instalado por padrão com o Visual Studio.
  • Inicia sob demanda usando uma cadeia de conexão.
  • Destina-se ao desenvolvimento de programas. Ele é executado no modo de usuário, portanto, não há nenhuma configuração complexa.
  • Por padrão, cria arquivos .mdf no diretório C:/Users/{user}.

Examinar o banco de dados

No menu Exibir, abra Pesquisador de Objetos do SQL Server (SSOX).

Clique com o botão direito do rato na tabela Movie (dbo.Movie) > View Designer

Clique com o botão direito do rato na tabela Filmes > Exibir Designer.

tabela de filmes aberta no Designer

Observe o ícone de chave ao lado de ID. Por padrão, o EF cria uma propriedade chamada ID chave primária.

Clique com o botão direito do rato na tabela Movie> Ver Dados

Clique com o botão direito do rato na tabela Filme > Ver Dados.

Tabela de filmes aberta mostrando dados da tabela

Semear o banco de dados

Crie uma nova classe chamada SeedData na pasta Models. Substitua o código gerado pelo seguinte:

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 houver algum filme no banco de dados, o inicializador de semente retornará e nenhum filme será adicionado.

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

<a name=snippet_"si">

Adicionar o inicializador de semente

Substitua o conteúdo do Program.cs pelo código a seguir. O novo código é destacado.

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();

Exclua todos os registros no banco de dados. Você pode fazer isso com os links de exclusão no navegador ou do SSOX.

Teste o aplicativo. Força o aplicativo a inicializar, chamando o código no arquivo Program.cs, para que o método seed seja executado. Para forçar a inicialização, feche a janela do prompt de comando que o Visual Studio abriu e reinicie pressionando Ctrl+F5.

A aplicação mostra os dados inicializados.

aplicação MVC Movie aberta no Microsoft Edge mostrando dados de filme

O objeto MvcMovieContext lida com a tarefa de ligar-se à base de dados e mapear objetos Movie para registos na base de dados. O contexto do banco de dados é registrado com o contêiner Dependency Injection no arquivo Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

O sistema ASP.NET Core Configuration lê a chave ConnectionString. Para desenvolvimento local, ele obtém a cadeia de conexão do arquivo appsettings.json:

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

Advertência

Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.

SQL Server Express LocalDB

LocalDB:

  • É uma versão leve do Mecanismo de Banco de Dados do SQL Server Express, instalado por padrão com o Visual Studio.
  • Inicia sob demanda usando uma string de conexão.
  • É direcionado para o desenvolvimento de programas. Ele é executado no modo de usuário, portanto, não há nenhuma configuração complexa.
  • Por padrão, cria arquivos .mdf no diretório C:/Users/{user}.

Semear o banco de dados

Crie uma nova classe chamada SeedData na pasta Models. Substitua o código gerado pelo seguinte:

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 houver algum filme no banco de dados, o inicializador de semente retornará e nenhum filme será adicionado.

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

Adicionar o inicializador de semente

Substitua o conteúdo do Program.cs pelo código a seguir. O novo código está destacado.

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();

Exclua todos os registros no banco de dados. Você pode fazer isso com os links de exclusão no navegador ou do SSOX.

Teste o aplicativo. Força o aplicativo a inicializar, chamando o código no arquivo Program.cs, para que o método seed seja executado. Para forçar a inicialização, feche a janela do prompt de comando que o Visual Studio abriu e reinicie pressionando Ctrl+F5.

A aplicação mostra os dados preenchidos.

aplicação MVC Movie aberta no Microsoft Edge mostrando dados do filme

O objeto MvcMovieContext lida com a tarefa de se conectar ao banco de dados e mapear o objeto Movie para registros de banco de dados. O contexto do banco de dados é registrado com o contêiner Dependency Injection no método ConfigureServices no arquivo Startup.cs:

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

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

O sistema ASP.NET Core Configuration lê a chave ConnectionString. Para desenvolvimento local, ele obtém a cadeia de conexão do arquivo appsettings.json:

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

Advertência

Este artigo usa um banco de dados local que não exige que o usuário seja autenticado. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.

SQL Server Express LocalDB

LocalDB:

  • É uma versão leve do Mecanismo de Banco de Dados do SQL Server Express, instalado por padrão com o Visual Studio.
  • Inicia sob demanda usando uma cadeia de conexão.
  • É direcionado para o desenvolvimento de um programa. Ele é executado no modo de usuário, portanto, não há nenhuma configuração complexa.
  • Por padrão, cria arquivos .mdf no diretório C:/Users/{user}.

Examinar o banco de dados

No menu Vista, abra Pesquisador de Objetos do SQL Server (SSOX).

Ver menu

Clique com o botão direito do rato na tabela Movie> View Designer

Clique com o botão direito do rato na tabela Filmes > Visualizar Designer

Tabela de Filmes aberta no Designer

Observe o ícone de chave ao lado de ID. Por padrão, o EF cria uma propriedade chamada ID chave primária.

Clique com o botão direito do rato na tabela Movie> Ver Dados

Clique com o botão direito do rato na tabela do Filme > Ver dados

Tabela de filmes aberta mostrando dados da tabela

Semear o banco de dados

Crie uma nova classe chamada SeedData na pasta Models. Substitua o código gerado pelo seguinte:

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 houver algum filme no banco de dados, o inicializador de semente retornará e nenhum filme será adicionado.

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

Adicionar o inicializador de semente

Substitua o conteúdo do Program.cs pelo seguinte código:

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>();
                });
    }
}

Teste o aplicativo.

Exclua todos os registros no banco de dados. Você pode fazer isso com os links de exclusão no navegador ou do SSOX.

Força o aplicativo a inicializar, chamando os métodos na classe Startup, para que o método seed seja executado. Para forçar a inicialização, o IIS Express deve ser interrompido e reiniciado. Você pode fazer isso com qualquer uma das seguintes abordagens:

  • Clique com o botão direito do mouse no ícone da bandeja do sistema IIS Express na área de notificação e toque em Sair ou Parar Site:

    ícone da bandeja do sistema IIS Express

    Menu contextual

    • Se você estava executando o VS no modo de não depuração, pressione F5 para executar no modo de depuração
    • Se você estava executando o VS no modo de depuração, pare o depurador e pressione F5

A aplicação mostra os dados pré-carregados.

aplicação MVC Movie aberta no Microsoft Edge mostrando dados de filmes