Compartilhar 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 ver a versão atual, consulte a versão .NET 10 deste artigo.

Aviso

Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, consulte o .NET e .NET Core Support Policy. Para ver a versão atual, consulte a versão .NET 10 deste artigo.

Introdução

Esta parte da série de tutoriais se concentra em trabalhar com um banco de dados SQL em seu aplicativo MVC ASP.NET Core.

Você aprenderá a:

  • Registre e configure o contexto do banco de dados Entity Framework Core para seu aplicativo MVC ASP.NET Core.
  • Trabalhe com cadeias de conexão de banco de dados para desenvolvimento local.
  • Use SQL Server Express LocalDB para desenvolvimento e examine seu banco de dados e dados usando SQL Server Pesquisador de Objetos.
  • Preencha seu banco de dados com dados de exemplo iniciais.

Pré-requisito

Este tutorial usa um banco de dados configurado na etapa anterior: Part 4, adicione um modelo a um aplicativo MVC ASP.NET Core.

Trabalhando com o contexto do banco de dados

O objeto MvcMovieContext cuida da tarefa de se conectar ao banco de dados e mapear objetos Movie para registros do banco de dados. O contexto do banco de dados é registrado com o contêiner Injeção de dependência no arquivo 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"
}

Aviso

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 SQL Server Express Mecanismo de Banco de Dados, instalado por padrão com Visual Studio.
  • Inicia quando solicitado usando uma *cadeia de conexão*.
  • É destinado ao desenvolvimento de programas. É executado no modo de usuário e, 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 View, abra SQL Server Pesquisador de Objetos (SSOX).

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

Clique com o botão direito do mouse na tabela Filme > Designer de Exibição.

Tabela de filmes aberta no Designer.

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

Clique com o botão direito na tabela Movie>Dados de Exibição

Clique com o botão direito do mouse na tabela > Filme e escolha Exibir Dados.

Tabela de filmes aberta sem mostrar dados.

Propagar 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 filmes no banco de dados, o inicializador de sementes é acionado e nenhum filme é adicionado.

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

Adicionar o inicializador de semeadura

Substitua o conteúdo de Program.cs pelo seguinte código. O novo código está realçado.

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?}")
    .WithStaticAssets();

app.Run();

Testar o aplicativo. Force 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.

O aplicativo mostra os dados semeados.

App MVC Movie aberto no Microsoft Edge mostrando dados de filmes.

E uma atualização da Movie tabela mostra os mesmos dados.

A tabela de filmes tem dados pré-preenchidos.

Observação

Talvez você não consiga inserir vírgulas decimais em campos decimais. Para dar suporte à validação do jQuery para localidades de idiomas diferentes do inglês que usam uma vírgula (“,”) para um ponto decimal e formatos de data diferentes do inglês dos EUA, você deve tomar medidas para globalizar o aplicativo. Veja este comentário 4076 do GitHub para instruções sobre a adição da vírgula decimal.

Introdução

Esta parte da série de tutoriais se concentra em trabalhar com um banco de dados SQL em seu aplicativo MVC ASP.NET Core.

Você aprenderá a:

  • Registre e configure o contexto do banco de dados Entity Framework Core para seu aplicativo MVC ASP.NET Core.
  • Trabalhe com cadeias de conexão de banco de dados para desenvolvimento local.
  • Use SQL Server Express LocalDB para desenvolvimento e examine seu banco de dados e dados usando SQL Server Pesquisador de Objetos.
  • Preencha seu banco de dados com dados de exemplo iniciais.

Pré-requisito

Este tutorial usa um banco de dados configurado na etapa anterior: Part 4, adicione um modelo a um aplicativo MVC ASP.NET Core.

Trabalhando com o contexto do banco de dados

O objeto MvcMovieContext cuida da tarefa de se conectar ao banco de dados e mapear objetos Movie para registros do banco de dados. O contexto do banco de dados é registrado no contêiner de Injeção de Dependência no arquivo 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"
}

Aviso

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 SQL Server Express Mecanismo de Banco de Dados, instalado por padrão com Visual Studio.
  • Inicia quando solicitado usando uma *cadeia de conexão*.
  • É destinado ao desenvolvimento de programas. É executado no modo de usuário e, 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 View, abra SQL Server Pesquisador de Objetos (SSOX).

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

Clique com o botão direito do mouse na tabela Filme > Exibir Designer

Tabela Movie aberta no Designer

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

Clique com o botão direito na tabela Movie>Dados de Exibição

Clique com o botão direito do mouse na tabela Filme > Visualizar Dados.

Tabela de Filmes aberta com os dados da tabela

Inicializar 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 um filme no banco de dados, o inicializador de semeadura será retornado e nenhum filme será adicionado.

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

Adicionar o inicializador de semeadura

Substitua o conteúdo de Program.cs pelo seguinte código. O novo código está realçado.

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. Faça isso com os links Excluir no navegador ou no SSOX.

Testar o aplicativo. Force o aplicativo a ser inicializado, chamando o código no arquivo Program.cs para que o método de semente 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.

O aplicativo mostra os dados semeados.

Aplicativo de filmes MVC aberto no Microsoft Edge mostrando dados de filmes

Observação

Talvez você não consiga inserir vírgulas decimais em campos decimais. Para dar suporte à validação do jQuery para localidades de idiomas diferentes do inglês que usam uma vírgula (“,”) para um ponto decimal e formatos de data diferentes do inglês dos EUA, você deve tomar medidas para globalizar o aplicativo. Veja este comentário 4076 no GitHub para obter instruções sobre como adicionar vírgula decimal.

Introdução

Esta parte da série de tutoriais se concentra em trabalhar com um banco de dados SQL em seu aplicativo MVC ASP.NET Core.

Você aprenderá a:

  • Registre e configure o contexto do banco de dados Entity Framework Core para seu aplicativo MVC ASP.NET Core.
  • Trabalhe com cadeias de conexão de banco de dados para desenvolvimento local.
  • Use SQL Server Express LocalDB para desenvolvimento e examine seu banco de dados e dados usando SQL Server Pesquisador de Objetos.
  • Preencha seu banco de dados com dados de exemplo iniciais.

Pré-requisito

Este tutorial usa um banco de dados configurado na etapa anterior: Part 4, adicione um modelo a um aplicativo MVC ASP.NET Core.

Trabalhando com o contexto do banco de dados

O objeto MvcMovieContext cuida da tarefa de se conectar ao banco de dados e mapear objetos Movie para registros do banco de dados. O contexto do banco de dados é registrado com o contêiner Injeção de dependência 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"
}

Aviso

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 SQL Server Express Mecanismo de Banco de Dados, instalado por padrão com Visual Studio.
  • Inicia quando solicitado usando uma *cadeia de conexão*.
  • É destinado ao desenvolvimento de programas. É executado no modo de usuário e, 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 View, abra SQL Server Pesquisador de Objetos (SSOX).

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

Clique com o botão direito do mouse na tabela Filme > Exibir Designer

Tabela Movie aberta no Designer

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

Clique com o botão direito na tabela Movie>Dados de Exibição

Clique com o botão direito do mouse na tabela Filme > Visualizar Dados.

Tabela de Filmes aberta com os dados da tabela

Inicializar 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 um filme no banco de dados, o inicializador de semeadura será retornado e nenhum filme será adicionado.

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

Adicionar o inicializador de semeadura

Substitua o conteúdo de Program.cs pelo seguinte código. O novo código está realçado.

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. Faça isso com os links Excluir no navegador ou no SSOX.

Testar o aplicativo. Force o aplicativo a ser inicializado, chamando o código no arquivo Program.cs para que o método de semente 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.

O aplicativo mostra os dados semeados.

Aplicativo de filmes MVC aberto no Microsoft Edge mostrando dados de filmes

Observação

Talvez você não consiga inserir vírgulas decimais em campos decimais. Para dar suporte à validação do jQuery para localidades de idiomas diferentes do inglês que usam uma vírgula (“,”) para um ponto decimal e formatos de data diferentes do inglês dos EUA, você deve tomar medidas para globalizar o aplicativo. Veja este comentário 4076 no GitHub para obter instruções sobre como adicionar vírgula decimal.

Introdução

Esta parte da série de tutoriais se concentra em trabalhar com um banco de dados SQL em seu aplicativo MVC ASP.NET Core.

Você aprenderá a:

  • Registre e configure o contexto do banco de dados Entity Framework Core para seu aplicativo MVC ASP.NET Core.
  • Trabalhe com cadeias de conexão de banco de dados para desenvolvimento local.
  • Use SQL Server Express LocalDB para desenvolvimento e examine seu banco de dados e dados usando SQL Server Pesquisador de Objetos.
  • Preencha seu banco de dados com dados de exemplo iniciais.

Pré-requisito

Este tutorial usa um banco de dados configurado na etapa anterior: Part 4, adicione um modelo a um aplicativo MVC ASP.NET Core.

Trabalhando com o contexto do banco de dados

O objeto MvcMovieContext cuida da tarefa de se conectar ao banco de dados e mapear objetos Movie para registros do banco de dados. O contexto do banco de dados é registrado com o contêiner Injeção de dependência 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"
}

Aviso

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 SQL Server Express Mecanismo de Banco de Dados, instalado por padrão com Visual Studio.
  • É iniciado sob demanda usando um cadeia de conexão.
  • Destina-se ao desenvolvimento de programas. É executado no modo de usuário e, 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 View, abra SQL Server Pesquisador de Objetos (SSOX).

Clique com o botão direito do mouse na Movie tabela (dbo.Movie) > Designer de Exibição

Clique com o botão direito do mouse na tabela Filme > Designer de Exibição

Tabela de Filmes aberta no Designer

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

Clique com o botão direito na tabela Movie>Dados de Exibição

Clique com o botão direito do mouse na tabela Filme > Visualizar Dados

Tabela Filme aberta exibindo dados da tabela

Inicializar 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 um filme no banco de dados, o inicializador de semeadura será retornado e nenhum filme será adicionado.

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

<a name=snippet_"si">

Adicionar o inicializador de semeadura

Substitua o conteúdo de Program.cs pelo seguinte código. O novo código está realçado.

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. Faça isso com os links Excluir no navegador ou no SSOX.

Testar o aplicativo. Force o aplicativo a ser inicializado, 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.

O aplicativo mostra os dados semeados.

Aplicativo de filmes MVC aberto no Microsoft Edge exibindo dados de filmes

Observação

Talvez você não consiga inserir vírgulas decimais em campos decimais. Para dar suporte à validação do jQuery para localidades de idiomas diferentes do inglês que usam uma vírgula (“,”) para um ponto decimal e formatos de data diferentes do inglês dos EUA, você deve tomar medidas para globalizar o aplicativo. Veja este comentário do GitHub 4076 para obter instruções sobre como adicionar vírgula decimal.

Introdução

Esta parte da série de tutoriais se concentra em trabalhar com um banco de dados SQL em seu aplicativo MVC ASP.NET Core.

Você aprenderá a:

  • Registre e configure o contexto do banco de dados Entity Framework Core para seu aplicativo MVC ASP.NET Core.
  • Trabalhe com cadeias de conexão de banco de dados para desenvolvimento local.
  • Use SQL Server Express LocalDB para desenvolvimento e examine seu banco de dados e dados usando SQL Server Pesquisador de Objetos.
  • Preencha seu banco de dados com dados de exemplo iniciais.

Pré-requisito

Este tutorial usa um banco de dados configurado na etapa anterior: Part 4, adicione um modelo a um aplicativo MVC ASP.NET Core.

Trabalhando com o contexto do banco de dados

O objeto MvcMovieContext cuida da tarefa de se conectar ao banco de dados e mapear objetos Movie para registros do banco de dados. O contexto do banco de dados é registrado com o contêiner Injeção de dependência 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"
}

Aviso

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 SQL Server Express Mecanismo de Banco de Dados, instalado por padrão com Visual Studio.
  • Inicia quando solicitado usando uma *cadeia de conexão*.
  • É destinado ao desenvolvimento de programas. É executado no modo de usuário e, portanto, não há nenhuma configuração complexa.
  • Por padrão, cria arquivos .mdf no diretório C:/Users/{user}.

Propagar 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 qualquer filme no banco de dados, o inicializador de seed retorna e nenhum filme será adicionado.

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

Adicionar o inicializador de semeadura

Substitua o conteúdo de Program.cs pelo seguinte código. O novo código está realçado.

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 a partir do SSOX.

Testar o aplicativo. Force 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.

O aplicativo mostra os dados inicializados.

App MVC Movie aberto no Microsoft Edge exibindo dados de filmes

Observação

Talvez você não consiga inserir vírgulas decimais em campos decimais. Para dar suporte à validação do jQuery para localidades de idiomas diferentes do inglês que usam uma vírgula (“,”) para um ponto decimal e formatos de data diferentes do inglês dos EUA, você deve tomar medidas para globalizar o aplicativo. Veja este comentário no GitHub 4076 para obter instruções sobre como adicionar vírgula decimal.

Introdução

Esta parte da série de tutoriais se concentra em trabalhar com um banco de dados SQL em seu aplicativo MVC ASP.NET Core.

Você aprenderá a:

  • Registre e configure o contexto do banco de dados Entity Framework Core para seu aplicativo MVC ASP.NET Core.
  • Trabalhe com cadeias de conexão de banco de dados para desenvolvimento local.
  • Use SQL Server Express LocalDB para desenvolvimento e examine seu banco de dados e dados usando SQL Server Pesquisador de Objetos.
  • Preencha seu banco de dados com dados de exemplo iniciais.

Pré-requisito

Este tutorial usa um banco de dados configurado na etapa anterior: Part 4, adicione um modelo a um aplicativo MVC ASP.NET Core.

Trabalhando com o contexto do banco de dados

O objeto MvcMovieContext cuida da tarefa de se conectar ao banco de dados e mapear objetos Movie para registros do banco de dados. O contexto do banco de dados é registrado no contêiner de Injeção de Dependências no método ConfigureServices do 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"
}

Aviso

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 SQL Server Express Mecanismo de Banco de Dados, instalado por padrão com Visual Studio.
  • Começa sob demanda usando uma cadeia de conexão.
  • É direcionado para o desenvolvimento de software. É executado no modo de usuário e, 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

Abra o menu View e abra o SQL Server Pesquisador de Objetos (SSOX).

Menu de exibição

Clique com o botão direito na tabela Movie>Exibir Designer

Clique com o botão direito do mouse na tabela Movie > Designer de Exibição

Tabela Movie aberta no Designer

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

Clique com o botão direito na tabela Movie>Dados de Exibição

Clique com o botão direito do mouse na tabela Movie > Dados de Exibição

A tabela de filmes está aberta, exibindo dados da tabela

Propagar 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 filmes no banco de dados, o inicializador de sementes é acionado e nenhum filme é adicionado.

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

Adicionar o inicializador de semeadura

Substitua o conteúdo de 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>();
                });
    }
}

Testar o aplicativo.

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

Force 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. Faça isso com uma das seguintes abordagens:

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

    Ícone de bandeja do sistema do IIS Express

    Menu contextual

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

O aplicativo mostra os dados semeados.

App MVC Movie aberto no Microsoft Edge exibindo dados de filmes

Observação

Talvez você não consiga inserir vírgulas decimais em campos decimais. Para dar suporte à validação do jQuery para localidades de idiomas diferentes do inglês que usam uma vírgula (“,”) para um ponto decimal e formatos de data diferentes do inglês dos EUA, você deve tomar medidas para globalizar o aplicativo. Veja este comentário 4076 do GitHub para instruções sobre a adição da vírgula decimal.