Parte 4 da série de tutoriais sobre Razor Pages

Observação

Esta não é a versão mais recente deste artigo. Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.

Importante

Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.

Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.

Por Joe Audette

O objeto RazorPagesMovieContext 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 em Program.cs:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

O sistema de Configuração do ASP.NET Core lê a chave ConnectionString. Para o desenvolvimento local, a configuração obtém a cadeia de caracteres de conexão do arquivo appsettings.json.

A cadeia de caracteres de conexão gerada é semelhante ao seguinte JSON:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Quando o aplicativo é implantado em um servidor de teste ou de produção, uma variável de ambiente pode ser usada para definir a cadeia de caracteres de conexão com um servidor de banco de dados de teste ou produção. Para obter mais informações, confira Configuração.

SQL Server Express LocalDB

O LocalDB é uma versão leve do mecanismo de banco de dados do SQL Server Express direcionada para o desenvolvimento de programas. O LocalDB é iniciado sob demanda e executado no modo de usuário e, portanto, não há nenhuma configuração complexa. Por padrão, o banco de dados LocalDB cria arquivos *.mdf no diretório C:\Users\<user>\.

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

    Menu de exibição

  2. Clique com o botão direito do mouse na tabela Movie e selecione Designer de exibição:

    Menus contextuais abertos na tabela Movie

    Tabelas Movie abertas no Designer

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

  3. Clique com o botão direito do mouse na tabela Movie e selecione Exibir dados:

    Tabela Movie aberta mostrando os dados da tabela

Propagar o banco de dados

Crie uma classe chamada SeedData na pasta Models com o seguinte código:

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new RazorPagesMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<RazorPagesMovieContext>>()))
        {
            if (context == null || context.Movie == null)
            {
                throw new ArgumentNullException("Null RazorPagesMovieContext");
            }

            // 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 propagação será retornado e nenhum filme será adicionado.

if (context.Movie.Any())
{
    return;
}

Adicionar o inicializador de semeadura

Atualize Program.cs com o seguinte código realçado:

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

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

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

No código anterior, Program.cs foi modificado para fazer o seguinte:

  • Obter uma instância de contexto de banco de dados do contêiner de DI (injeção de dependência).
  • Chame o método seedData.Initialize, passando para ele a instância de contexto do banco de dados.
  • Descarte o contexto quando o método de semente for concluído. A instrução using garante que o contexto seja descartado.

A seguinte exceção ocorre quando Update-Database não foi executado:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Testar o aplicativo

Exclua todos os registros no banco de dados para que o método de propagação seja executado. Interrompa e inicie o aplicativo para propagar o banco de dados. Se o banco de dados não for propagado, coloque um ponto de interrupção em if (context.Movie.Any()) e examine cada etapa do código.

O aplicativo mostra os dados propagados:

Aplicativo de filmes aberto no navegador mostrando dados de filmes

Próximas etapas

O objeto RazorPagesMovieContext 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 em Program.cs:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

O sistema de Configuração do ASP.NET Core lê a chave ConnectionString. Para o desenvolvimento local, a configuração obtém a cadeia de caracteres de conexão do arquivo appsettings.json.

A cadeia de caracteres de conexão gerada é semelhante ao seguinte JSON:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Quando o aplicativo é implantado em um servidor de teste ou de produção, uma variável de ambiente pode ser usada para definir a cadeia de caracteres de conexão com um servidor de banco de dados de teste ou produção. Para obter mais informações, confira Configuração.

SQL Server Express LocalDB

O LocalDB é uma versão leve do mecanismo de banco de dados do SQL Server Express direcionada para o desenvolvimento de programas. O LocalDB é iniciado sob demanda e executado no modo de usuário e, portanto, não há nenhuma configuração complexa. Por padrão, o banco de dados LocalDB cria arquivos *.mdf no diretório C:\Users\<user>\.

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

    Menu de exibição

  2. Clique com o botão direito do mouse na tabela Movie e selecione Designer de exibição:

    Menus contextuais abertos na tabela Movie

    Tabelas Movie abertas no Designer

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

  3. Clique com o botão direito do mouse na tabela Movie e selecione Exibir dados:

    Tabela Movie aberta mostrando os dados da tabela

Propagar o banco de dados

Crie uma classe chamada SeedData na pasta Models com o seguinte código:

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new RazorPagesMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<RazorPagesMovieContext>>()))
        {
            if (context == null || context.Movie == null)
            {
                throw new ArgumentNullException("Null RazorPagesMovieContext");
            }

            // 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 propagação será retornado e nenhum filme será adicionado.

if (context.Movie.Any())
{
    return;
}

Adicionar o inicializador de semeadura

Atualize Program.cs com o seguinte código realçado:

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

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

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

No código anterior, Program.cs foi modificado para fazer o seguinte:

  • Obter uma instância de contexto de banco de dados do contêiner de DI (injeção de dependência).
  • Chame o método seedData.Initialize, passando para ele a instância de contexto do banco de dados.
  • Descarte o contexto quando o método de semente for concluído. A instrução using garante que o contexto seja descartado.

A seguinte exceção ocorre quando Update-Database não foi executado:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Testar o aplicativo

Exclua todos os registros no banco de dados para que o método de propagação seja executado. Interrompa e inicie o aplicativo para propagar o banco de dados. Se o banco de dados não for propagado, coloque um ponto de interrupção em if (context.Movie.Any()) e examine cada etapa do código.

O aplicativo mostra os dados propagados:

Aplicativo de filmes aberto no navegador mostrando dados de filmes

Próximas etapas

O objeto RazorPagesMovieContext 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 em Program.cs:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

O sistema de Configuração do ASP.NET Core lê a chave ConnectionString. Para o desenvolvimento local, a configuração obtém a cadeia de caracteres de conexão do arquivo appsettings.json.

A cadeia de caracteres de conexão gerada é semelhante ao seguinte JSON:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Quando o aplicativo é implantado em um servidor de teste ou de produção, uma variável de ambiente pode ser usada para definir a cadeia de caracteres de conexão com um servidor de banco de dados de teste ou produção. Para obter mais informações, confira Configuração.

SQL Server Express LocalDB

O LocalDB é uma versão leve do mecanismo de banco de dados do SQL Server Express direcionada para o desenvolvimento de programas. O LocalDB é iniciado sob demanda e executado no modo de usuário e, portanto, não há nenhuma configuração complexa. Por padrão, o banco de dados LocalDB cria arquivos *.mdf no diretório C:\Users\<user>\.

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

    Menu de exibição

  2. Clique com o botão direito do mouse na tabela Movie e selecione Designer de exibição:

    Menus contextuais abertos na tabela Movie

    Tabelas Movie abertas no Designer

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

  3. Clique com o botão direito do mouse na tabela Movie e selecione Exibir dados:

    Tabela Movie aberta mostrando os dados da tabela

Propagar o banco de dados

Crie uma classe chamada SeedData na pasta Models com o seguinte código:

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                if (context == null || context.Movie == null)
                {
                    throw new ArgumentNullException("Null RazorPagesMovieContext");
                }

                // 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 propagação será retornado e nenhum filme será adicionado.

if (context.Movie.Any())
{
    return;
}

Adicionar o inicializador de semeadura

Atualize Program.cs com o seguinte código realçado:

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

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

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

No código anterior, Program.cs foi modificado para fazer o seguinte:

  • Obter uma instância de contexto de banco de dados do contêiner de DI (injeção de dependência).
  • Chame o método seedData.Initialize, passando para ele a instância de contexto do banco de dados.
  • Descarte o contexto quando o método de semente for concluído. A instrução using garante que o contexto seja descartado.

A seguinte exceção ocorre quando Update-Database não foi executado:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Testar o aplicativo

Exclua todos os registros no banco de dados para que o método de propagação seja executado. Interrompa e inicie o aplicativo para propagar o banco de dados. Se o banco de dados não for propagado, coloque um ponto de interrupção em if (context.Movie.Any()) e examine cada etapa do código.

O aplicativo mostra os dados propagados:

Aplicativo de filmes aberto no navegador mostrando dados de filmes

Próximas etapas

Exibir ou baixar um código de exemplo (como baixar).

O objeto RazorPagesMovieContext cuida da tarefa de se conectar ao banco de dados e mapear objetos Movie para registros do banco de dados. O contexto de banco de dados é registrado com o contêiner Injeção de Dependência no método ConfigureServices em Startup.cs:

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

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

O sistema de Configuração do ASP.NET Core lê a chave ConnectionString. Para o desenvolvimento local, a configuração obtém a cadeia de caracteres de conexão do arquivo appsettings.json.

A cadeia de caracteres de conexão gerada é semelhante ao seguinte JSON:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Quando o aplicativo é implantado em um servidor de teste ou de produção, uma variável de ambiente pode ser usada para definir a cadeia de caracteres de conexão com um servidor de banco de dados de teste ou produção. Para obter mais informações, confira Configuração.

SQL Server Express LocalDB

O LocalDB é uma versão leve do mecanismo de banco de dados do SQL Server Express direcionada para o desenvolvimento de programas. O LocalDB é iniciado sob demanda e executado no modo de usuário e, portanto, não há nenhuma configuração complexa. Por padrão, o banco de dados LocalDB cria arquivos *.mdf no diretório C:\Users\<user>\.

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

    Menu de exibição

  2. Clique com o botão direito do mouse na tabela Movie e selecione Designer de exibição:

    Menus contextuais abertos na tabela Movie

    Tabelas Movie abertas no Designer

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

  3. Clique com o botão direito do mouse na tabela Movie e selecione Exibir dados:

    Tabela Movie aberta mostrando os dados da tabela

Propagar o banco de dados

Crie uma classe chamada SeedData na pasta Models com o seguinte código:

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

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                // 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 propagação será retornado e nenhum filme será adicionado.

if (context.Movie.Any())
{
    return;
}

Adicionar o inicializador de semeadura

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

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;

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

No código anterior, o método Main foi modificado para fazer o seguinte:

  • Obtenha uma instância de contexto de banco de dados do contêiner de injeção de dependência.
  • Chame o método seedData.Initialize, passando para ele a instância de contexto do banco de dados.
  • Descarte o contexto quando o método de semente for concluído. A instrução using garante que o contexto seja descartado.

A seguinte exceção ocorre quando Update-Database não foi executado:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Testar o aplicativo

  1. Exclua todos os registros no banco de dados. Use os links de exclusão no navegador ou no SSOX

  2. Force o aplicativo a ser inicializado, chamando os métodos na classe Startup para que o método de propagação seja executado. Para forçar a inicialização, o IIS Express deve ser interrompido e reiniciado. Interrompa e reinicie o IIS com qualquer uma das seguintes abordagens:

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

      Ícone de bandeja do sistema do IIS Express

      Menu contextual

    2. Se o aplicativo estiver sendo executado no modo sem depuração, pressione F5 para executar no modo de depuração.

    3. Se o aplicativo estiver sendo executado no modo de depuração, pare o depurador e pressione F5.

O aplicativo mostra os dados propagados:

Aplicativo de filmes aberto no navegador mostrando dados de filmes

Próximas etapas

Exibir ou baixar um código de exemplo (como baixar).

O objeto RazorPagesMovieContext cuida da tarefa de se conectar ao banco de dados e mapear objetos Movie para registros do banco de dados. O contexto de banco de dados é registrado com o contêiner Injeção de Dependência no método ConfigureServices em Startup.cs:

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

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

O sistema de Configuração do ASP.NET Core lê a chave ConnectionString. Para o desenvolvimento local, a configuração obtém a cadeia de caracteres de conexão do arquivo appsettings.json.

A cadeia de caracteres de conexão gerada é semelhante à descrição a seguir:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Quando o aplicativo é implantado em um servidor de teste ou de produção, uma variável de ambiente pode ser usada para definir a cadeia de caracteres de conexão com um servidor de banco de dados de teste ou produção. Consulte Configuração para obter mais informações.

SQL Server Express LocalDB

O LocalDB é uma versão leve do mecanismo de banco de dados do SQL Server Express direcionada para o desenvolvimento de programas. O LocalDB é iniciado sob demanda e executado no modo de usuário e, portanto, não há nenhuma configuração complexa. Por padrão, o banco de dados LocalDB cria arquivos *.mdf no diretório C:\Users\<user>\.

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

    Menu de exibição

  • Clique com o botão direito do mouse na tabela Movie e selecione Designer de exibição:

    Menus contextuais abertos na tabela Movie

    Tabelas Movie abertas no Designer

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

  • Clique com o botão direito do mouse na tabela Movie e selecione Exibir dados:

    Tabela Movie aberta mostrando os dados da tabela

Propagar o banco de dados

Crie uma classe chamada SeedData na pasta Models com o seguinte código:

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

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                // 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 propagação será retornado e nenhum filme será adicionado.

if (context.Movie.Any())
{
    return;
}

Adicionar o inicializador de semeadura

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

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;

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

No código anterior, o método Main foi modificado para fazer o seguinte:

  • Obtenha uma instância de contexto de banco de dados do contêiner de injeção de dependência.
  • Chame o método seedData.Initialize, passando para ele a instância de contexto do banco de dados.
  • Descarte o contexto quando o método de semente for concluído. A instrução using garante que o contexto seja descartado.

A seguinte exceção ocorre quando Update-Database não foi executado:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Testar o aplicativo

  • Exclua todos os registros no banco de dados. Use os links de exclusão no navegador ou no SSOX.

  • Force o aplicativo a ser inicializado, chamando os métodos na classe Startup para que o método de propagação seja executado. Para forçar a inicialização, o IIS Express deve ser interrompido e reiniciado. Interrompa e reinicie o IIS com qualquer 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 o aplicativo estiver sendo executado no modo sem depuração, pressione F5 para executar no modo de depuração.
      • Se o aplicativo estiver sendo executado no modo de depuração, pare o depurador e pressione F5.

O aplicativo mostra os dados propagados:

Aplicativo de filme aberto no Chrome mostrando os dados do filme

Próximas etapas