Partilhar via


Trabalhar com dados

Sugestão

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.

Blazor-for-ASP-NET-Web-Forms-Developers miniatura da capa do eBook.

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:

  • Fontes de dados
  • ADO.NET
  • Estrutura de Entidades

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.

Fontes de dados

ADO.NET é a abordagem de baixo nível para interagir com um banco de dados. Os seus aplicativos podem estabelecer uma conexão com o banco de dados utilizando Comandos, Tabelas de Dados, e Datasets para interação. 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, Commande 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.

Estrutura de Entidades

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á uma not null restrição para ajudar a impor esse comportamento declarado da propriedade.
  • Description será armazenado numa coluna configurada para armazenamento de texto e terá um comprimento máximo configurado de 4000 caracteres, conforme ditado pelo atributo [MaxLength]. O esquema do banco de dados será configurado com uma coluna nomeada MaxLength usando o tipo de dados varchar(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 string de conexão no seu arquivoappsettings.json, nas variáveis de ambiente ou em outros locais de armazenamento de configuração e substituir essa string embutida apropriadamente.

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.

EF: Primeiro o Banco de Dados

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, são criadas classes de suporte para as tabelas Product e Customer que foram especificadas com as opções -t. 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 nos seus Blazor componentes com a diretiva @inject ou um atributo [Inject] numa 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 . O sistema retorna o conteúdo no formato JSON e é desserializado em objetos de issue apropriados do GitHub. 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 lidar em cada página. Para obter mais informações, consulte Fazer solicitações HTTP usando IHttpClientFactory.