Перейти к содержанию

Магазин на Asp.Net Core MVC EF. Часть 1

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 4,67 из 5)
Загрузка...

[ Полезный рекламный блок ]

Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.


В этом уроке рассмотрим процесс построения реалистичного проекта, который продемонстрирует совместное использование ASP.NET Core MVC и Entity Framework Core. Проект будет простым, но близким к реальности, и фокусироваться на часто применяемых средствах Entity Framework Core.

Я ожидаю от вас минимальные знания концепций Entity Framework Core, поэтому в некоторых местах, вдаваться в подробности не стану.

Магазин на Asp.Net Core MVC EF

Создание и настройка проекта

Модель и Репозиторий

Добавление контроллера и представления

Хранение данных с Entity Framework Core

Подготовка модели данных

Создание класса контекста данных

Изменение реализации хранилища

Конфигурирование поставщика базы данных и класса контекста

Создание базы данных

Выполнение приложения

Избегание ловушек, связанных с запросами

Итог

В данном уроке мы создадим простое самодостаточное приложение ASP.NET Core MVC, добавим поддержку инфраструктуры Entity Framework Core и сохранение данных приложения в БД.

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

Создание и настройка проекта

Чтобы создать проект GameStore, запустите Visual Studio и выберите в меню File (Файл) — New Project (Создать Проект). Укажите шаблон проекта ASP.NET Core Web Application (Веб-приложение ASP.NET Core). Введите GameStore, в поле Name, на следующей странице укажите Framework .Net 6.0 и нажмите кнопку Create:

интернет магазин asp.net core

Модель и Репозиторий

Модель для приложения GameStore будет основана на списке товаров. Создайте папку Models и добавьте в нее файл класса по имени Product.cs со следующим содержимым:

Мне нравится обеспечивать согласованный доступ к данным в приложении с ис­ пользованием паттерна «Хранилище» (Repository), в котором интерфейс определяет свойства и методы, предназначенные для доступа к данным, а для работы с механизмом хранения данных применяется класс реализации. Преимущество использования паттерна «Хранилище» связано с облегчением модульного тестирования части MVC приложения, а также с тем, что детали, касающиеся хранения данных, скрыты от остальных частей приложения.

Чтобы создать интерфейс хранилища, создайте папку Interfaces и добавьте в нее файл интерфейса по имени IProduct.cs со следующим содержимым:

Метод GetAllProducts() будет предоставлять доступ только по чтению ко всем товарам, известным приложению. Метод AddProduct() будет использоваться для добавления новых товаров.

На данном этапе мы собираемся хранить объекты модели в памяти, а немного позже заменим это инфраструктурой Entity Framework Core. Создайте папку Repository и добавьте в нее файл класса по имени ProductRepository.cs со следующим содержимым:

Класс ProductRepository реализует интерфейс IProduct и применяет экземпляр List для отслеживания объектов Product, т.е. в случае останова или перезапуска приложения данные будут утрачиваться. Постоянное хранилище будет введено в позже, а хранилища в памяти вполне достаточно для приведения в работоспособное состояние части ASP.NET Core МVС проекта, прежде чем добавлять часть EntityFramework Core.

Добавьте в класс Program следующий оператор,  чтобы зарегистрировать класс ProductRepository как реализацию для использования в качестве за­висимостей интерфейса IProduct:

Данная строка кода, регистрирует класс ProductRepository с применением метода AddSingleton. В результате при распознавании зависимости интерфейса IProduct в первый раз создается одиночный объект, который будет использоваться для всех последующих зависимостей.

Любой магазин на Asp.Net Core MVC, не сможет нормально функционировать без контролеров и представлений. Перейдем к их созданию.

Добавление контроллера и представления

Основной акцент в рассматриваемом примере приложения сделан на управлении объектами товаров, потому что это создает великолепную возможность для демонстрации различных средств работы с данными. Нам нужен контроллер, который будет получать НТTP-запросы и транслировать их в операции над объектами Product, так что создайте папку Controllers, добавьте в нее файл по имени HomeController.cs, со следующим содержимым:

Метод действия Index() передает коллекцию объектов Product из хранилища своему представлению, которое отобразит пользователю экранную таблицу с данны­ ми. Метод AddProduct() сохраняет новые объекты Product, которые основаны на данных, полученных в НТTP-запросе POST. Далее создайте папку Views/Home и поместите в нее файл по имени Index.cshtml со следующим содержимым:

Файл  Index.cshtml является представлением, которое будет отображать данные Product приложения и разрешать пользователю создавать новые объекты.

добавление товара asp.net core mvc

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

Запустим приложение и выполним добавление товара:

add products asp.net core mvc

Сейчас данные приложения хранятся в памяти, т.е. в случае останова или перезапуска приложения сведения обо всех товарах утрачиваются. В следующей главе в проект будет добавлена поддержка Entity Framework Соrе для обеспечения постоянного хранения данных в БД.

Хранение данных с Entity Framework Core

 

Конфигурация подключения

В настоящей главе демонстрируется сохранение данных приложения GameStore в БД. Будет показано, как добавить инфраструктуру Entity Framework Core в проект, каким образом подготовить модель данных, как создать и использовать БД и каким образом заставить приложение делать эффективные SQL-запросы.

Для начала загрузим библиотеку Entity Framework Core Sql Server:

ef sql server

Или через Package Manager Console:

Перейдем в файл appsettings.json и пропишем конфигурацию подключения и логирования:

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

Вы обязаны обеспечить, чтобы строка подключения была единственной неразрывной строкой. Формат строки подключения специфичен для каждого сервера баз данных.

Даже в проекте, сохраняющем лишь небольшой объем данных, важно понимать запросы и команды SQL, которые инфраструктура Entity Framework Core посылает серверу баз данных.

Подготовка модели данных

Для сохранения данных в БД инфраструктура Eпtity Framework Core должна уметь уникальным образом идентифицировать каждый объект, что требует выбора свойства, которое будет использоваться как первичный ключ. В большинстве проектов простейший способ определения первичного ключа предусматривает добавление в класс модели данных свойства типа int по имени Id.

Изменим класс Product, следующим образом:

Этот подход означает, что инфраструктура Entity Framework Core будет конфигурировать БД так, чтобы сервер баз данных генерировал значения первичного ключа, и вам не пришлось беспокоиться об избегании дубликатов. Применение значения int гарантирует наличие большого диапазона значений первичного ключа, и большинство проектов будут в состоянии неограниченно хранить данные, не тревожась о том, что ключи закончатся.

Создание класса контекста данных

В обеспечении доступа к данным в БД инфраструктура Entity Framework Core полагается на класс контекста БД. Чтобы снабдить пример приложения контекстом, добавьте в папку Models файл класса по имени ApplicationContext.cs со следующим кодом:

Когда инфраструктура Entity Framework Core используется для сохранения прос­той модели данных вроде той, что определена в приложении GameStore. Класс контекста БД соответственно прост — хотя ситуация изменится с ростом сложности модели данных в последующих главах.

Текущая структура проекта, выглядит следующим образом:

структура проекта asp.net core

Изменение реализации хранилища

Теперь пора обновить класс реализации хранилища, чтобы обращаться к данным через класс контекста, определенный ранее. Изменим код класса ProductRepository.cs, следующим образом:

В приложении ASP.NET Core MVC, доступ к объектам контекста данных управляется с использованием внедрения зависимостей и потому в класс ProductRepository был добавлен конструктор, принимающий объект ApplicationContext, который будет предоставлен средством внедрения зависимостей во время выполнения.

Свойство Products, определенное интерфейсом хранилища, может быть реализовано путем возвращения свойства DbSet<Product>, которое определено в классе контекста. Аналогично метод AddProduct() реализовать легко, потому что объект DbSet<Product> определяет метод Add(), который принимает объекты Product и сохраняет их на постоянной основе.

Конфигурирование поставщика базы данных и класса контекста

Добавьте в класс Program.cs операторы конфигурации, чтобы сообщить инфраструктуре Entity Framework Core о том, каким образом использовать строку подключения, которую должен применять поставщик БД, и как управлять классом контекста:

Весь код файла Program.cs:

Расширяющий метод AddDbContext<T>() применяется для настройки класса контекста, указывает инфраструктуре Entity Framework Core, какой поставщик БД использовать (в этом случае посредством метода UseSqlServer(), но для каждого поставщика БД предусмотрен свой метод), и предоставляет строку подключения.

Обратите внимание, что изменен также и метод, который конфигурирует внедре­ние зависимостей для интерфейса IRepository:

В главе «Модель и Репозиторий» с помощью метода AddSingleton() обеспечивалось применение одиночного объекта ProductRepository для распознавания всех зависимостей интерфейса IProduct, что было важно, поскольку данные приложения хранились в экземпляре List, и желательно было всегда использовать тот же самый объект. Теперь, когда применяется инфраструктура Entity Framework Core, задействован метод AddTransient(), который гарантирует создание нового объекта ProductRepository при каждом распознавании зависимости интерфейса IProduct. Такой подход ва­жен, потому что инфраструктура Entity Fгamework Core рассчитывает на создание но­вого объекта контекста для каждого НТТР-запроса в приложении ASP.NET Core МVС.

Создание базы данных

В предыдущем разделе для инфраструктуры Entity Framework Core был указан вид данных, подлежащих хранению, и способ подключения к серверу баз данных. Далее  необходимо создать БД.

Инфраструктура Entity Framework Core управляет базами данных через средство, называемое миграциями, которые представляют собой наборы изменений, создающих или модифицирующих БД с целью ее синхронизации с моделью данных.

Для работы с миграцией, необходимо скачать следующую библиотеку:

Или через Package Manager Console:

Для создания миграции в окне Package Manager Console введите следующую команду:

asp.net core mvc migration

Init или Initial — общепринятое имя, используемое для миграции, которая производит первоначальную подготовку БД.

При выполнении команды из листинга 5.8 инфраструктура Entity Framework Саге инспектирует проект, находит класс контекста и применяет его для создания миграции. В результате в окне Solution Explorer появится папка Migrations, содержащая файлы классов, операторы которых подготовят БД.

Просто создать миграцию, которая представляет собой всего лишь набор инструкций, недостаточно. Инструкции миграции должны быть выполнены, чтобы создать БД, которая сможет хранить данные приложения. Для выполнения инструкций миграции, в окне Package Manager Console выполните команду:

Инфраструктура Entity Fгamework Core подключится к серверу баз данных, ука­занному в строке подключения, и выполнит операторы в миграции. Результатом будет БД, которую можно использовать для хранения объектов Product.

Выполнение приложения

Основная поддержка для постоянного хранения объектов Product на месте и приложение готово к тестированию, несмотря на то, что работа над ним еще не завершена. Запустите приложение, попробуйте добавить данные, протестировать его работу.

выполнение asp.net core mvc

Пользовательский интерфейс остался неизменным, но внутренне инфраструктура Entity Framework Соге сохраняет данные в БД. Остановите и перезапустите приложение, вы увидите, что введенные ранее данные по-прежнему доступны.

Избегание ловушек, связанных с запросами

Приложение функционирует, данные сохраняются в БД, но все еще есть работа, которую нужно сделать, чтобы извлечь максимум из Entity Framework Core. В частности, необходимо избежать двух распространенных ловушек. Такие проблемы можно идентифицировать, исследуя SQL-запросы, которые Entity Framework Core посылает БД. С этой целью добавьте в метод действия Index() контроллера Home оператор, облегчающий просмотр запросов к БД, которые инициируются НТТР- запросом:

Метод Console.Clear() очищает консоль, когда вызывается действие Index, так что запросы к БД из предшествующих НTТР-запросов не будут видны. Запустите приложение и просмотрите журнальные сообщения, которые отобразились.

asp.net core console

Инфраструктура Entity Fгamework Core облегчает запрашивание БД с применени­ем LINQ, хотя и не всегда работает так, как можно было бы ожидать. В представлении Index, используемом контроллером Home, для выяснения количества объектов Product, которые были сохранены в БД, применяется метод Count() из LINQ:

Что бы определить, сколько Product есть в БД, инфраструктура Entity Framework использует SQL оператор SELECT для получения всех доступных данных Product, применять полученные данные для создания последовательности и затем подсчитывает их.

Когда в БД есть только три объекта, сложностей не возникает, но с ростом количества объектов объем работы, требуемой для их подсчета в такой манере, становится проблемой. Более эффективный подход предусматривает выполнение подсчета сер­вером баз данных, что освобождает инфраструктуру Eпtity Framework Core от необ­ходимости перемещения всех данных и создания объектов.

Реализовать такой подход можно, внеся в тип модели представления одно простое изменение, изменить тип модели с IEnumerable на IQueryable:

Перезагрузив окно браузера, вы увидите, что первые два запроса, которые Eпtity Framework Core посылает серверу баз данных, изменились:

asp.net core IQueryable

Запрос SELECT COUNT предлагает серверу баз данных подсчитать количество объектов Product. не извлекая данные и не создавая любые объекты в приложении.

Получение разных запросов для разных типов моделей представлений может вы­глядеть как нелогичное поведение, и понимание причин, почему так происходит, жизненно важно в гарантировании инфраструктуре Eпtity Framework Core возможностей эффективного запрашивания баз данных.

Инфраструктура Eпtity Framework Core включает дублирующий набор расширяющих методов LINQ, которые оперируют на объектах, реализующих интерфейс IQueryable<T>. Этот интерфейс представляет запрос к БД, и такое дублирование означает, что операции вроде Count() могут столь же легко выполняться над данными в БД, как над объектами в памяти.

Итог

В уроке была добавлена поддержка для сохранения данных в БД и выдачи запросов к ней. Приводились объяснения процесса перехода к постоянному хранилищу данных и демонстрации, каким образом запросы, инициируемые приложением, должны адаптироваться к эффективной работе с инфраструктурой Entity Framework Core.

В следующем уроке будут добавлены средства для модификации и удаления данных в БД.

На этом статья «Магазин на Asp.Net Core MVC EF», подошла к концу, надеюсь вам было интересно.  Вы можете скачать исходный код в моем репозитории — Github.

Поделитесь вашим опытом в комментариях, какой был ваш первый проект, магазин на Asp.Net Core MVC EF или что-то другое?

Так же вам может быть интересна предыдущая статья:

Выполнение действий по расписанию Quartz.NET


Вы хотите научится писать код на языке программирования C#?

Создавать различные информационные системы, состоящие из сайтов, мобильных клиентов, десктопных приложений, телеграмм-ботов и т.д.

Переходите к нам на страницу Dijix и ознакомьтесь с условиями обучения, мы специализируемся только на индивидуальных занятиях, как для начинающих, так и для более продвинутых программистов. Вы можете взять как одно занятие для проработки интересующего Вас вопроса, так и несколько, для более плотной работы. Благодаря личному кабинету, каждый студент повысит качество своего обучения, в вашем распоряжении:

  • Доступ к пройденному материалу
  • Тематические статьи
  • Библиотека книг
  • Онлайн тестирование
  • Общение в закрытых группах

https://dijix.com.ua

Живи в своем мире, программируй в нашем.


 

Опубликовано в рубрикеAsp.Net Core
Подписаться
Уведомить о
guest
5 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Асгар
Асгар
1 год назад

Очень четко написано!

Anjali Corkery
Anjali Corkery
1 год назад

Спасибо большое за ваш труд!

Max Lernov
Max Lernov
1 год назад

Вот это да, настолько подробно и красиво написано, спасибо вам большое!
У вас в дальнейшем планируются подобного рода гайды?

Макс
Макс
1 год назад

Лучшее, что я видел…

Алексей
Алексей
6 месяцев назад

Один из хороших примеров за последнее время ( чаще всего все устарело, или на старых вверсиях, что для начинающих боль и слезы).

5
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x