Compartir a través de


Trabajar con datos

Sugerencia

Este contenido es un extracto del libro electrónico "Blazor for ASP.NET Web Forms Developers for Azure" (Blazor para desarrolladores de ASP.NET Web Forms), disponible en Documentación de .NET o como un PDF descargable y gratuito que se puede leer sin conexión.

Miniatura de portada del libro electrónico Blazor para desarrolladores de ASP.NET Web Forms.

El acceso a datos es la red troncal de una aplicación de ASP.NET Web Forms. Si va a crear formularios para la web, ¿qué ocurre con esos datos? Con Web Forms, había varias técnicas de acceso a datos que se podían usar para interactuar con una base de datos:

  • Orígenes de datos
  • ADO.NET
  • Entity Framework (un marco de trabajo para gestionar bases de datos relacionales)

Los orígenes de datos eran controles que podía colocar en una página de formularios Web Forms y configurar como otros controles. Visual Studio proporcionó un conjunto amigable de diálogos para configurar y enlazar los controles a las páginas de Web Forms. Los desarrolladores que disfrutan de un enfoque de "código bajo" o "sin código" prefieren esta técnica cuando se publicó por primera vez Web Forms.

Orígenes de datos

ADO.NET es el enfoque de bajo nivel para interactuar con una base de datos. Las aplicaciones podrían crear una conexión a la base de datos con comandos, tablas de datos y conjuntos de datos para interactuar. Los resultados se podrían enlazar a campos en pantalla sin mucho código. El inconveniente de este enfoque era que cada conjunto de objetos de ADO.NET (Connection, Commandy DataTable) estaba enlazado a bibliotecas proporcionadas por un proveedor de base de datos. El uso de estos componentes hizo que el código sea rígido y difícil de migrar a una base de datos diferente.

Entity Framework (un marco de trabajo para gestionar bases de datos relacionales)

Entity Framework (EF) es el marco de asignación relacional de objetos de código abierto mantenido por .NET Foundation. Inicialmente publicado con .NET Framework, EF permite generar código para las conexiones de base de datos, los esquemas de almacenamiento y las interacciones. Con esta abstracción, puede centrarse en las reglas de negocios de la aplicación y permitir que un administrador de bases de datos de confianza administre la base de datos. En .NET, puede usar una versión actualizada de EF denominada EF Core. EF Core ayuda a generar y mantener las interacciones entre el código y la base de datos con una serie de comandos disponibles para usted mediante la dotnet ef herramienta de línea de comandos. Echemos un vistazo a algunos ejemplos para ayudarle a trabajar con una base de datos.

Code First de EF

Una manera rápida de empezar a crear las interacciones de la base de datos es empezar con los objetos de clase con los que desea trabajar. EF proporciona una herramienta para ayudar a generar el código de base de datos adecuado para las clases. Este enfoque se denomina desarrollo de "Code First". Considere la siguiente Product clase para una aplicación de escaparate de ejemplo que queremos almacenar en una base de datos relacional como 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; }
}

El producto tiene una clave principal y tres campos adicionales que se crearían en nuestra base de datos:

  • EF identificará la Id propiedad como clave principal por convención.
  • Name se almacenará en una columna configurada para el almacenamiento de texto. El [Required] atributo que decora esta propiedad agregará una not null restricción para ayudar a aplicar este comportamiento declarado de la propiedad.
  • Description se almacenará en una columna configurada para el almacenamiento de texto y tendrá una longitud máxima configurada de 4000 caracteres según lo dictado por el [MaxLength] atributo . El esquema de la base de datos se configurará con una columna denominada MaxLength usando el tipo varchar(4000) de datos.
  • La propiedad Price se almacenará como moneda. El [Range] atributo generará restricciones adecuadas para evitar el almacenamiento de datos fuera de los valores mínimo y máximo declarados.

Es necesario agregar esta Product clase a una clase de contexto de base de datos que defina las operaciones de conexión y traducción con nuestra base de datos.

public class MyDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

La MyDbContext clase proporciona la propiedad que define el acceso y la traducción de la Product clase . La aplicación configura esta clase para la interacción con la base de datos mediante las siguientes entradas en el método Startup de la clase ConfigureServices (o en la ubicación adecuada en Program.cs utilizando la propiedad builder.Services en lugar de services):

services.AddDbContext<MyDbContext>(options =>
    options.UseSqlServer("MY DATABASE CONNECTION STRING"));

El código anterior se conectará a una base de datos de SQL Server con la cadena de conexión especificada. Puede colocar la cadena de conexión en el archivo appsettings.json, las variables de entorno o otras ubicaciones de almacenamiento de configuración y reemplazar esta cadena insertada adecuadamente.

A continuación, puede generar la tabla de base de datos adecuada para esta clase mediante los siguientes comandos:

dotnet ef migrations add 'Create Product table'
dotnet ef database update

El primer comando define los cambios que va a realizar en el esquema de la base de datos como una nueva migración de EF denominada Create Product table. Una migración define cómo aplicar y quitar los nuevos cambios en la base de datos.

Una vez aplicada, tiene una tabla sencilla Product en la base de datos y algunas clases nuevas agregadas al proyecto que ayudan a administrar el esquema de la base de datos. Puede encontrar estas clases generadas, de forma predeterminada, en una nueva carpeta denominada Migraciones. Al realizar cambios en la Product clase o agregar más clases relacionadas que le gustaría interactuar con la base de datos, debe volver a ejecutar los comandos de la línea de comandos con un nuevo nombre de la migración. Este comando generará otro conjunto de clases de migración para actualizar el esquema de la base de datos.

EF Database First

Para las bases de datos existentes, puede generar las clases para EF Core mediante las herramientas de línea de comandos de .NET. Para aplicar scaffolding a las clases, use una variación del comando siguiente:

dotnet ef dbcontext scaffold "CONNECTION STRING" Microsoft.EntityFrameworkCore.SqlServer -c MyDbContext -t Product -t Customer

El comando anterior se conecta a la base de datos mediante la cadena de conexión y el Microsoft.EntityFrameworkCore.SqlServer proveedor especificados. Una vez conectado, se crea una clase de contexto de base de datos denominada MyDbContext . Además, se crean clases auxiliares para las Product tablas y Customer que se especificaron con las -t opciones. Hay muchas opciones de configuración para este comando para generar la jerarquía de clases adecuada para la base de datos. Para obtener una referencia completa, consulte la documentación del comando.

Puede encontrar más información sobre EF Core en el sitio de Microsoft Docs.

Interactuar con servicios web

Cuando se lanzó ASP.NET por primera vez, los servicios SOAP eran la manera preferida de intercambiar datos de servidores web y clientes. Ha cambiado mucho desde ese momento y las interacciones preferidas con los servicios han cambiado a interacciones directas del cliente HTTP. Con ASP.NET Core y Blazor, puede registrar la configuración de su HttpClient en Program.cs o en el método Startup de la clase ConfigureServices. Use esa configuración cuando necesite interactuar con el punto de conexión HTTP. Tenga en cuenta el código de configuración siguiente:

// 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");
});

Siempre que necesite acceder a los datos desde GitHub, cree un cliente con un nombre de github. El cliente se configura con la dirección base y los encabezados de solicitud se establecen correctamente. Inserte IHttpClientFactory en los componentes de Blazor con la directiva @inject o un atributo [Inject] en una propiedad. Cree el cliente con nombre e interactúe con los servicios mediante la sintaxis siguiente:

@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();
    }
}

Este método devuelve la cadena que describe la colección de problemas en el repositorio de GitHub dotnet/docs . Devuelve contenido en formato JSON y se deserializa en los objetos de incidencias de GitHub adecuados. Hay muchas maneras de configurar el HttpClientFactory para entregar objetos preconfigurados HttpClient. Pruebe a configurar varias HttpClient instancias con nombres y puntos de conexión diferentes para los distintos servicios web con los que trabaja. Este enfoque hará que sea más fácil trabajar con las interacciones con esos servicios en cada página. Para obtener más información, consulte Realización de solicitudes HTTP con IHttpClientFactory.