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.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, confira .NET e a Política de Suporte do .NET Core. 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.")));
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 conexão gerada é semelhante ao seguinte JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-f2e0482c-952d-4b1c-afe9-a1a3dfe52e55;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
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).
Clique com o botão direito do mouse na tabela
Movie
e selecione Designer de exibição:Observe o ícone de chave ao lado de
ID
. Por padrão, o EF cria uma propriedade chamadaID
para a chave primária.Clique com o botão direito do mouse na tabela
Movie
e selecione Exibir dados:
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.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
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:
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 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"
}
}
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
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).
Clique com o botão direito do mouse na tabela
Movie
e selecione Designer de exibição:Observe o ícone de chave ao lado de
ID
. Por padrão, o EF cria uma propriedade chamadaID
para a chave primária.Clique com o botão direito do mouse na tabela
Movie
e selecione Exibir dados:
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:
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 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"
}
}
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
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).
Clique com o botão direito do mouse na tabela
Movie
e selecione Designer de exibição:Observe o ícone de chave ao lado de
ID
. Por padrão, o EF cria uma propriedade chamadaID
para a chave primária.Clique com o botão direito do mouse na tabela
Movie
e selecione Exibir dados:
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:
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 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"
}
}
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
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).
Clique com o botão direito do mouse na tabela
Movie
e selecione Designer de exibição:Observe o ícone de chave ao lado de
ID
. Por padrão, o EF cria uma propriedade chamadaID
para a chave primária.Clique com o botão direito do mouse na tabela
Movie
e selecione Exibir dados:
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:
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 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"
}
}
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
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).
Clique com o botão direito do mouse na tabela
Movie
e selecione Designer de exibição:Observe o ícone de chave ao lado de
ID
. Por padrão, o EF cria uma propriedade chamadaID
para a chave primária.Clique com o botão direito do mouse na tabela
Movie
e selecione Exibir dados:
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 da bandeja do sistema do IIS Express na área de notificação e clique em Sair ou em Parar site:
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:
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"
}
}
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
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).
Clique com o botão direito do mouse na tabela
Movie
e selecione Designer de exibição:
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:
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:
- 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: