Поделиться через


Работа с данными

Совет

Это фрагмент из электронной книги для разработчиков ASP NET веб-формы для Azure, Blazor доступных в документации .NET или в виде бесплатного скачиваемого PDF-файла, который можно читать в автономном режиме.

Blazor-for-ASP-NET-Web-Forms-Developers eBook cover thumbnail.

Доступ к данным — это основа приложения ASP.NET Web Forms. Что происходит с этими данными при создании форм для Интернета? В ASP.NET Web Forms существовало несколько методов доступа к данным, которые можно было использовать для взаимодействия с базой данных:

  • Источники данных
  • ADO.NET
  • Entity Framework

Источники данных — это элементы управления, которые можно разместить на странице Web Forms и настроить аналогично другим элементам управления. Visual Studio предоставляет удобный набор диалоговых окон для настройки и привязки элементов управления к страницам Web Forms. Разработчики, которые не пишут или почти не пишут код, предпочитают этот метод с первого выпуска Web Forms.

Data Sources

ADO.NET — это низкоуровневый подход для взаимодействия с базой данных. Приложения могут создавать подключение к базе данных с помощью команд, наборов данных и наборов данных для взаимодействия. Затем результаты могут быть привязаны к полям на экране без большого объема кода. Недостаток этого подхода заключается в том, что каждый набор объектов ADO.NET (Connection, Command и DataTable ) был привязан к библиотекам, предоставленным поставщиком базы данных. Из-за этих компонентов код стал неповоротливым, его сложно перенести в другую базу данных.

Entity Framework

Entity Framework (EF) — это инфраструктура объектно-реляционного сопоставления с открытым кодом, поддерживаемая .NET Foundation. Первоначально выпущенная с платформой .NET Framework, EF позволяет создавать код для подключений к базе данных, схем хранилища и взаимодействий. Эта абстракция позволяет сосредоточиться на бизнес-правилах приложения и передать управление базой данных доверенному администратору базы данных. В .NET можно использовать обновленную версию EF — EF Core. EF Core помогает создавать и обслуживать взаимодействия между кодом и базой данных с помощью ряда команд, доступных при помощи программы командной строки dotnet ef. Давайте рассмотрим несколько примеров для работы с базой данных.

EF Code First

Чтобы быстро приступить к привязке взаимодействий с базой данных, начните с объектов класса, с которыми вы хотите работать. EF предоставляет средство, помогающее создать соответствующий код базы данных для классов. Этот подход называется разработкой Code First. Рассмотрим следующий класс Product для примера приложения витрины, которое мы хотим хранить в реляционной базе данных, например 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; }
}

У продукта есть первичный ключ и три дополнительных поля, которые будут созданы в базе данных:

  • EF будет определять свойство Id как первичный ключ по соглашению.
  • Name будет храниться в столбце, настроенном для хранения текста. Атрибут [Required], дополняющий это свойство, добавит ограничение not null, чтобы обеспечить соблюдение объявленного поведения свойства.
  • Description будет храниться в столбце, настроенном для хранения текста, и имеет максимальную длину в 4000 символов в соответствии с атрибутом [MaxLength]. Схема базы данных будет настроена с помощью столбца с именем MaxLength с использованием типа данных varchar(4000).
  • Свойство Price будет храниться как валюта. Атрибут [Range] создаст соответствующие ограничения, чтобы предотвратить хранение данных за пределами минимального и максимального объявленного значения.

Нам нужно добавить этот класс Product в класс контекста базы данных, который определяет операции подключения и преобразования в нашей базе данных.

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

Класс MyDbContext предоставляет одно свойство, определяющее доступ и преобразование для класса Product. Приложение настраивает этот класс для взаимодействия с базой данных, используя следующие записи в методе ConfigureServices класса Startup (или соответствующее расположение в Program.cs с помощью свойства builder.Services вместо services):

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

Приведенный выше код будет подключаться к базе данных SQL Server с указанной строкой подключения. Строку подключения можно поместить в файл appsettings.json, переменные среды или другие места хранения конфигурации и соответствующим образом заменить эту внедренную строку.

Затем можно создать таблицу базы данных, подходящую для этого класса, с помощью следующих команд:

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

Первая команда определяет изменения, внесенные в схему базы данных, в качестве новой миграции EF Create Product table. Миграция определяет способ применения и удаления новых изменений базы данных.

После применения вы получите простую таблицу Product в базе данных и некоторые новые классы, добавленные в проект и помогающие управлять схемой базы данных. Созданные классы по умолчанию можно найти в новой папке с именем Migrations. При внесении изменений в класс Product или добавлении дополнительных связанных классов, которые будут взаимодействовать с базой данных, необходимо снова выполнить команды с новым именем миграции. Эта команда создаст другой набор классов миграции для обновления схемы базы данных.

EF Database First

Для существующих баз данных можно создать классы для EF Core с помощью программ командной строки .NET. Для формирования шаблонов классов используйте разновидность следующей команды:

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

Предыдущая команда подключается к базе данных, используя указанную строку соединения и поставщик Microsoft.EntityFrameworkCore.SqlServer. После подключения создается класс контекста базы данных с именем MyDbContext. Кроме того, создаются вспомогательные классы для таблиц Product и Customer, которые были указаны с помощью параметров -t. Существует множество параметров конфигурации этой команды для создания иерархии классов, подходящей для вашей базы данных. Полный справочник см. в документации по команде.

Дополнительные сведения о EF Core можно найти на сайте "Документация Майкрософт".

Взаимодействие с веб-службами

При первом выпуске ASP.NET службы SOAP были предпочтительным способом для обмена данными между веб-серверами и клиентами. С тех пор многое изменилось, и предпочтительные методы сдвинулись в сторону прямого взаимодействия с клиентами HTTP. С помощью ASP.NET Core и Blazor можно зарегистрировать конфигурацию HttpClient в Program.cs или в методе ConfigureServices класса Startup. Используйте эту конфигурацию, когда необходимо взаимодействовать с конечной точкой HTTP. Рассмотрите следующий код конфигурации:

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

Если нужно получить доступ к данным из GitHub, создайте клиент с именем github. Клиент настраивается с базовым адресом, а заголовки запроса задаются соответствующим образом. Вставьте IHttpClientFactory в компоненты Blazor с помощью директивы @inject или атрибута [Inject] в свойстве. Создайте именованный клиент и взаимодействуйте со службами, используя следующий синтаксис:

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

Этот метод возвращает строку, описывающую коллекцию проблем в репозитории dotnet/docs на GitHub. Он возвращает содержимое в формате JSON и десериализуется в соответствующие объекты проблем GitHub. Существует множество способов настройки HttpClientFactory для предоставления предварительно настроенных объектов HttpClient. Попробуйте настроить несколько экземпляров HttpClient с разными именами и конечными точками для различных веб-служб, с которыми вы работаете. Этот подход упростит взаимодействие с этими службами на каждой странице. Дополнительные сведения см. в статье Выполнение HTTP-запросов с помощью IHttpClientFactory.