Trabalhar com dados
Gorjeta
Este conteúdo é um excerto do eBook, Blazor para ASP NET Web Forms Developers for Azure, disponível no .NET Docs ou como um PDF transferível gratuito que pode ser lido offline.
O acesso aos dados é a espinha dorsal de um aplicativo ASP.NET Web Forms. Se você estiver criando formulários para a Web, o que acontece com esses dados? Com os Web Forms, havia várias técnicas de acesso a dados que você podia usar para interagir com um banco de dados:
- Data Sources (Origens de Dados)
- ADO.NET
- Entity Framework
As Fontes de Dados eram controles que você podia colocar em uma página de Web Forms e configurar como outros controles. O Visual Studio forneceu um conjunto amigável de caixas de diálogo para configurar e vincular os controles às suas páginas de Web Forms. Os desenvolvedores que gostam de uma abordagem "low code" ou "no code" preferiram essa técnica quando os Web Forms foram lançados pela primeira vez.
ADO.NET é a abordagem de baixo nível para interagir com um banco de dados. Seus aplicativos podem criar uma conexão com o banco de dados com Comandos, Datatables e Datasets para interagir. Os resultados poderiam então ser vinculados a campos na tela sem muito código. A desvantagem dessa abordagem era que cada conjunto de objetos ADO.NET (Connection
, Command
e DataTable
) estava vinculado a bibliotecas fornecidas por um fornecedor de banco de dados. O uso desses componentes tornou o código rígido e difícil de migrar para um banco de dados diferente.
Entity Framework
O Entity Framework (EF) é a estrutura de mapeamento objeto-relacional de código aberto mantida pelo .NET Foundation. Inicialmente lançado com o .NET Framework, o EF permite gerar código para as conexões de banco de dados, esquemas de armazenamento e interações. Com essa abstração, você pode se concentrar nas regras de negócios do seu aplicativo e permitir que o banco de dados seja gerenciado por um administrador de banco de dados confiável. No .NET, você pode usar uma versão atualizada do EF chamada EF Core. O EF Core ajuda a gerar e manter as interações entre seu código e o banco de dados com uma série de comandos que estão disponíveis para você usando a dotnet ef
ferramenta de linha de comando. Vamos dar uma olhada em alguns exemplos para você trabalhar com um banco de dados.
Código EF primeiro
Uma maneira rápida de começar a criar suas interações de banco de dados é começar com os objetos de classe com os quais você deseja trabalhar. O EF fornece uma ferramenta para ajudar a gerar o código de banco de dados apropriado para suas classes. Essa abordagem é chamada de desenvolvimento "Code First". Considere a classe a seguir Product
para um aplicativo de vitrine de exemplo que queremos armazenar em um banco de dados relacional como o Microsoft SQL Server.
public class Product
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
[MaxLength(4000)]
public string Description { get; set; }
[Range(0, 99999,99)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }
}
O produto tem uma chave primária e três campos adicionais que seriam criados em nosso banco de dados:
- O EF identificará a
Id
propriedade como uma chave primária por convenção. Name
será armazenado em uma coluna configurada para armazenamento de texto. O[Required]
atributo que decora essa propriedade adicionará umanot null
restrição para ajudar a impor esse comportamento declarado da propriedade.Description
será armazenado em uma coluna configurada para armazenamento de texto e terá um comprimento máximo configurado de 4000 caracteres, conforme ditado[MaxLength]
pelo atributo. O esquema do banco de dados será configurado com uma coluna nomeadaMaxLength
usando o tipo de dadosvarchar(4000)
.- A
Price
propriedade será armazenada como moeda. O[Range]
atributo gerará restrições apropriadas para impedir o armazenamento de dados fora dos valores mínimo e máximo declarados.
Precisamos adicionar essa Product
classe a uma classe de contexto de banco de dados que define as operações de conexão e tradução com nosso banco de dados.
public class MyDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
A MyDbContext
classe fornece a única propriedade que define o acesso e a tradução para a Product
classe. Seu aplicativo configura essa classe para interação com o banco de dados usando as seguintes entradas no Startup
método da ConfigureServices
classe (ou local apropriado em Program.cs usando a builder.Services
propriedade em vez de services
):
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer("MY DATABASE CONNECTION STRING"));
O código anterior se conectará a um banco de dados do SQL Server com a cadeia de conexão especificada. Você pode colocar a cadeia de conexão em seu arquivo appsettings.json, variáveis de ambiente ou outros locais de armazenamento de configuração e substituir essa cadeia de caracteres incorporada adequadamente.
Em seguida, você pode gerar a tabela de banco de dados apropriada para essa classe usando os seguintes comandos:
dotnet ef migrations add 'Create Product table'
dotnet ef database update
O primeiro comando define as alterações que você está fazendo no esquema de banco de dados como uma nova migração do EF chamada Create Product table
. Uma Migração define como aplicar e remover as novas alterações do banco de dados.
Uma vez aplicado, você tem uma tabela simples Product
em seu banco de dados e algumas novas classes adicionadas ao projeto que ajudam a gerenciar o esquema de banco de dados. Você pode encontrar essas classes geradas, por padrão, em uma nova pasta chamada Migrações. Quando você faz alterações na Product
classe ou adiciona mais classes relacionadas que gostaria de interagir com seu banco de dados, você precisa executar os comandos de linha de comando novamente com um novo nome da migração. Esse comando gerará outro conjunto de classes de migração para atualizar seu esquema de banco de dados.
Banco de dados EF primeiro
Para bancos de dados existentes, você pode gerar as classes para o EF Core usando as ferramentas de linha de comando do .NET. Para organizar as classes, use uma variação do seguinte comando:
dotnet ef dbcontext scaffold "CONNECTION STRING" Microsoft.EntityFrameworkCore.SqlServer -c MyDbContext -t Product -t Customer
O comando anterior se conecta ao banco de dados usando a cadeia de conexão especificada e o Microsoft.EntityFrameworkCore.SqlServer
provedor. Uma vez conectada, uma classe de contexto de banco de dados nomeada MyDbContext
é criada. Além disso, as classes de suporte são criadas para as Product
tabelas e Customer
que foram especificadas com as -t
opções. Há muitas opções de configuração para este comando para gerar a hierarquia de classes apropriada para seu banco de dados. Para obter uma referência completa, consulte a documentação do comando.
Mais informações sobre o EF Core podem ser encontradas no site do Microsoft Docs.
Interagir com serviços Web
Quando ASP.NET foi lançado pela primeira vez, os serviços SOAP eram a maneira preferida para servidores web e clientes trocarem dados. Muito mudou desde então, e as interações preferidas com serviços mudaram para interações diretas com clientes HTTP. Com ASP.NET Core e Blazor, você pode registrar a configuração do seu HttpClient
no Program.cs ou no Startup
método da ConfigureServices
classe. Use essa configuração quando precisar interagir com o ponto de extremidade HTTP. Considere o seguinte código de configuração:
// in Program.cs
builder.Services.AddHttpClient("github", client =>
{
client.BaseAddress = new Uri("http://api.github.com/");
// Github API versioning
client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
// Github requires a user-agent
client.DefaultRequestHeaders.Add("User-Agent", "BlazorWebForms-Sample");
});
Sempre que precisar acessar dados do GitHub, crie um cliente com um nome de github
. O cliente é configurado com o endereço base e os cabeçalhos de solicitação são definidos adequadamente. Injete o IHttpClientFactory
em seus Blazor componentes com a @inject
diretiva ou um [Inject]
atributo em uma propriedade. Crie seu cliente nomeado e interaja com serviços usando a seguinte sintaxe:
@inject IHttpClientFactory factory
...
@code {
protected override async Task OnInitializedAsync()
{
var client = factory.CreateClient("github");
var response = await client.GetAsync("repos/dotnet/docs/issues");
response.EnsureStatusCode();
var content = await response.Content.ReadAsStringAsync();
}
}
Esse método retorna a cadeia de caracteres que descreve a coleção de problemas no repositório GitHub dotnet/docs . Ele retorna conteúdo no formato JSON e é desserializado em objetos de problema do GitHub apropriados. Há muitas maneiras de configurar o HttpClientFactory
para entregar objetos pré-configurados HttpClient
. Tente configurar várias HttpClient
instâncias com nomes e pontos de extremidade diferentes para os vários serviços Web com os quais você trabalha. Essa abordagem tornará suas interações com esses serviços mais fáceis de trabalhar em cada página. Para obter mais informações, consulte Fazer solicitações HTTP usando IHttpClientFactory.