Skip to content

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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 5,00 из 5)
Завантаження...

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

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


У цій статті, ми продовжимо писати магазин на Asp.Net Core і Entity Framework Core. У другій частині ми додали засоби для модифікації та видалення даних у БД. Для ознайомлення з другою частиною, перейдіть за посиланням.

У цьому розділі модель даних для додатка GameStore буде розширено за рамки єдиного класу Product. Ви побачите, як нормалізувати дані, замінюючи строкову властивість окремим класом, і дізнаєтеся, яким чином отримувати доступ до даних після їх створення. Крім того, додається підтримка для представлення замовлень покупців, яка є важливою частиною будь-якого інтернет-магазину.

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

Підготовчі кроки

Додавання відношення до моделі даних

Створення стосунків

Оновлення контексту та створення сховища

Створення та застосування міграції

Створення контролера та подання

Заповнення бази даних категоріями

Заполнение базы данных категориями

Вибір категорії для товару

Додавання підтримки для замовлень

Створення сховища і підготовка бази даних

Створення та застосування міграції

Створення контролерів і уявлень

Збереження даних замовлення

Підсумок

Підготовчі кроки

У рамках підготовки ми консолідуємо процес створення і редагування об’єктів Product в єдиному поданні. У наступному коді об’єднуємо методи дій контролера Home, що додають або оновлюють об’єкти Product, і видаляємо дії, які виконували масові оновлення:

Під час з’ясування, чи бажає користувач модифікувати наявний об’єкт або ж створити новий, об’єднані дії спираються на стандартне значення для Id int.

Тепер оновимо подання Index, яке відобразить зміни, внесені в контролер:

Запустивши додаток, ви побачите такий вміст:

интернет магазин c#

Виконайте видалення всіх даних із таблиці.

Додавання відношення до моделі даних

Наразі кожен об’єкт Product створюється зі значенням властивостей Category, яке має тип string. У реальному проєкті питання лише в тому, скільки часу мине до ситуації, коли через помилки товар буде поміщено в невідповідну категорію. Щоб уникнути подібних проблем, дані застосунку можна нормалізувати з використанням відношень, у підсумку скорочуючи дублювання і гарантуючи безпеку.

Додавання класу моделі даних

Відправною точкою стане створення нового класу моделі даних. Додайте в папку Models файл на ім’я Category.cs і визначте в ньому клас, як показано в наступному коді:

Клас Category представляє категорію товарів. Властивість Id містить первинний ключ, а значення для властивостей Name і Description будуть надані користувачем під час створення нової категорії та її збереження в БД.

Створення стосунків

На наступному кроці створюється відношення між двома класами моделі даних, що робиться шляхом додавання властивостей до одного з класів. У будь-якому відношенні між даними один із класів відомий як залежна сутність і саме до нього додаються властивості. Щоб з’ясувати, який клас є залежною сутністю, поставте собі запитання, об’єкт якого з типів не може існувати без іншого. У випадку додатка GameStore категорія здатна існувати, навіть не маючи в собі товарів, але кожен товар має належати до якоїсь категорії – і це означає, що в такій ситуації залежною сутністю виявляється клас Product. Додайте в клас Product дві властивості, які створюють відношення з класом Category:

Першим тут додано властивість на ім’я СategoryId, що є прикладом властивості зовнішнього ключа, яку інфраструктура Entity Framework Core буде при міняти для відстеження відношення за рахунок присвоєння їй значення первинного ключа, що ідентифікує об’єкт Category. Ім’я властивості зовнішнього ключа складається з імені класу плюс ім’я властивості первинного ключа, даючи в результаті Categoryld.

Друга властивість замінює наявну властивість Category і являє собою приклад навігаційної властивості. Інфраструктура Еntity Framework Core заповнюватиме цю властивість об’єктом Сategory, який ідентифікується властивістю зовнішнього ключа, що робить його більш придатним для роботи з даними в БД.

Оновлення контексту та створення сховища

Для забезпечення доступу до об’єктів Category додайте в клас контексту БД властивість DbSet<T>:

Нова властивість слідує за тим самим шаблоном, що й наявна властивість: вона оголошена як властивість public з конструкціями get і set, а повертає екземпляр DbSet<T>, де Т – клас, який потрібно зберігати в БД.

Коли модель даних розширюється, ви можете забезпечити решту коду в застосунку доступом до нових типів даних, додавши члени до наявного класу сховища або створивши новий такий клас. Для додатка GameStore давайте створимо окреме сховище, просто щоб продемонструвати, як це робиться.

У папку Interfaces, додайте інтерфейс ICategory, з таким вмістом:

У папку Repository додайте клас CategoryRepository, з таким вмістом:

Ми створили інтерфейс сховища і клас реалізації, за аналогією, як і з класом Product.

Зареєструйте сховище та його реалізацію в класі Program для застосування із засобом впровадження залежностей:

Створення та застосування міграції

Інфраструктура Entity Framework Core не зможе зберігати об’єкти Category доти, доки БД не буде оновлено для відповідності змінам, внесеним у модель даних. Щоб оновити БД, потрібно створити і застосувати до неї міграцію.

Для створення міграції у вікні Package Manager Console введіть таку команду:

asp.net core migration init

Для виконання інструкцій міграції, у вікні Package Manager Console виконайте команду:

Перша команда створює нову міграцію на ім’я Categories, яка міститиме команди, необхідні для підготовки БД до зберігання нових об’єктів. Друга команда виконує такі команди для оновлення БД.

Створення контролера та подання

Ми створили обов’язкове відношення між класами Product і Category, тобто кожен об’єкт Product має бути асоційований з об’єктом Category. При відношенні такого виду корисно забезпечувати користувача засобами для управління об’єктами Category в БД. Додайте в папку Controllers файл класу на ім’я CategoriesController.cs і помістіть у нього такий код:

Контролер Categories приймає у своєму конструкторі об’єкт сховища для доступу до даних категорій і визначає дії, які підтримують запитування БД, а також створення, оновлення та видалення об’єктів Category. Щоб забезпечити контролер поданням, створіть папку Views/Categories і додайте в неї файл на ім’я Index.cshtml з таким вмістом:

Подання Index пропонує єдиний інтерфейс для керування категоріями та доручає створення і редагування об’єктів частковому поданню. Щоб створити часткове подання, додайте в папку Views/Categories файл на ім’я CategoryEditor.cshtml і помістіть у нього такий вміст:

Для полегшення переміщення додатком у файл Views – Shared – _Layout.cshtml додайте такий код:

Запустіть додаток і перевірте його роботу.

adding items c#

Заповнення бази даних категоріями

Запустіть застосунок і додайте 3 будь-які категорії на сторінці “Категорії”:

asp.net core add category

Робота з пов’язаними даними

Інфраструктура Entity Framework Сore ігнорує відносини, якщо тільки їх явно не включають у запити. Це означає, що навігаційні властивості, як-от властивість Category, визначена в класі Product, за замовчуванням залишатимуться рівними null. Розширювальний метод Include() застосовується для повідомлення інфраструктурі EF про необхідність заповнення навігаційної властивості пов’язаними даними.

Перейдемо в клас ProductRepository і змінимо його реалізацію, включивши об’єкт категорії:

Метод Include() визначено в просторі імен Microsoft.Entity FrameworkCore, він приймає лямбда-вираз, що вибирає навігаційну властивість, яку бажано включити до запиту. Метод Find(), що застосовується для методу GetProduct(), не може використовуватися з методом Include(), тому він замінений методом First(), який призводить до того ж самого ефекту. Результат внесених змін полягає в тому, що інфраструктура Entity Framework Core буде заповнювати навігаційну властивість Product.Сategory для об’єктів Product, створених властивістю Products і методом GetProduct().

Зверніть увагу на зміни в методі UpdateProduct(). По-перше, вихідні дані запитуються безпосередньо, а не через метод GetProduct(), тому що завантажувати пов’язані дані під час виконання оновлення небажано. По-друге, закомментовано оператор, що встановлює властивість Category, і додано оператор, який натомість встановлює властивість Сategoryid. Встановлення властивості зовнішнього ключа – все, що необхідно інфраструктурі Entity Framework Core для оновлення відношення між двома об’єктами в БД.

Вибір категорії для товару

Оновимо контролер Home, щоб він мав доступ до даних Category через сховище і передавав їх своєму поданню. Це дасть змогу поданням запропонувати вибір із повного набору категорій під час редагування або створення об’єкта Product:

Щоб надати користувачеві можливість вибору однієї з категорій при створенні або редагуванні об’єкта Product, додамо в подання UpdateProduct елемент select:

У розмітку включено елемент-заповнювач option на випадок, якщо подання використовується для створення нового об’єкта Product, і передбачено вираз Razor для застосування атрибута selected, якщо поточний об’єкт редагується. Залишилося лише оновити подання Index, щоб прослідувати за навігаційною властивістю і відобразити для кожного об’єкта Product назву обраної категорії. Перейдемо в Home / Index.cshtml і змінимо вміст:

Запустіть застосунок, виконайте додавання і редагування товару, переконайтеся, що вибір і відображення категорії працює коректно.

entity framework add product

Після створення кожного об’єкта ініціюється дія Index для відображення результатів, яка змушує інфраструктуру Entity Framework Core запросити в БД дані Product і пов’язані з ними об’єкти Category. Ви можете побачити, як він транслюється в SQL-запит, переглянувши згенеровані додатком журнальні повідомлення:

Інфраструктура Entity Framework Core використовує зовнішній ключ для запиту даних, які необхідні для створення об’єктів Category, пов’язаних з об’єктами Product, і застосовує внутрішнє з’єднання для об’єднання даних з таблиць Products і Categories.

P.S. Якщо ви видалите об’єкт Category, то пов’язані з ним об’єкти Product, також видаляться, що є стандартною конфігурацією для обов’язкових відносин.

Додавання підтримки для замовлень

Щоб продемонструвати більш складне відношення, ми додамо підтримку для створення і збереження замовлень і будемо використовувати їх для представлення вибору товарів, зробленого покупцями. У наступних розділах ми розширимо модель даних додатковими масами, оновимо БД і додамо контролер для управління новими даними.

Створення класів моделі даних

Почнемо з додавання в папку Models файлу на ім’я Order.cs з таким вмістом:

Клас Order має властивості, які зберігають ім’я та адресу покупця, а також ознаку, чи доставлені товари. Є також навігаційна властивість, що забезпечує доступ до пов’язаних об’єктів OrderLine, які представлятимуть окремі вибрані товари.

Для створення класу OrderLine додайте в папку Models файл на ім’я OrderLine.cs з таким вмістом:

Кожен об’єкт OrderLine пов’язаний з об’єктами Order і Product і має властивість, яка відображає, скільки товару покупець замовив. Щоб забезпечити зручний доступ до даних Order, додамо в клас контексту ApplicationContext такі властивості:

Створення сховища і підготовка бази даних

Для надання узгодженого доступу до нових даних решті коду додатка додайте в папку Interfaces файл на ім’я IOrder.cs з таким вмістом:

Додайте в папку Repository файл на ім’я OrderRepository.cs з таким вмістом:

Реалізація сховища слідує шаблону, прийнятому для інших сховищ, і заради простоти не задіює засіб виявлення змін. Зверніть увагу на застосування методів Include() і Theninclude() для навігації моделлю даних і додавання в запити пов’язаних даних.

Додайте в клас Program оператор, щоб система впровадження залежностей розпізнавала залежності від інтерфейсу IOrderRepository з використанням короткочасних об’єктів OrderRepository:

Створення та застосування міграції

Інфраструктура Entity Framework Core не зможе зберігати об’єкти Order доти, доки БД не буде оновлено для відповідності змінам, внесеним у модель даних. Щоб оновити БД, потрібно створити і застосувати до неї міграцію.

Для створення міграції у вікні Package Manager Console введіть таку команду:

migration ef c#

Для виконання інструкцій міграції, у вікні Package Manager Console виконайте команду:

Перша команда створює нову міграцію на ім’я Orders, яка міститиме команди, потрібні для підготовки БД до зберігання нових об’єктів. Друга команда виконує такі команди для оновлення БД.

Поточна структура застосованих міграцій:

migration history

Поточна структура проєкту:

asp.net core project structure

Створення контролерів і уявлень

Увесь сполучний код Entity Framework Core для роботи з об’єктами Order на місці; наступний крок передбачає додавання засобів MVC, що дадуть змогу створювати та керувати екземплярами. Додайте в папку Controllers контролер на ім’я OrdersController.cs, з таким вмістом:

Реалізація методу AddOrUpdateOrder() буде завершена, коли стануть доступними інші засоби.

Оператори LINQ у методі дії EditOrder() можуть виглядати заплутаними, але вони здійснюють підготовку даних OrderLine, щоб мати один об’єкт OrderLine для кожного об’єкта Product, навіть якщо раніше цей товар не вибирався.

Таким чином, для нового замовлення властивість ViewBag.Lines буде заповнюватися послідовністю об’єктів OrderLine, що відповідають кожному об’єкту Product у БД, зі встановленими в 0 властивостями Id і Quantity. Коли об’єкт зберігається в БД, нульове значення Id вказуватиме, що об’єкт є новим, і сервер баз даних присвоїть йому новий унікальний первинний ключ.

Для наявних замовлень властивість ViewBag.Lines заповнюватиметься об’єктами OrderLine, прочитаними з БД, і додатковими об’єктами з нульовими властивостями Id для решти товарів.

Далі необхідно створити подання, яке відображатиме список усіх об’єктів у БД. Додайте папку Views/Orderers і помістіть у неї файл на ім’я Index.cshtml з таким вмістом:

Подання відображає зведення по об’єктах Order з БД, а також сумарну вартість замовлених товарів і розмір прибутку, який буде отримано. Тут присутні кнопки для створення нового замовлення і для редагування та видалення наявного замовлення.

Щоб забезпечити додаток поданням для створення або редагування замовлення, додайте в папку Views/Orderers файл на ім’я EditOrder.cshtml, з таким вмістом:

Подання EditOrder пропонує користувачеві форму з елементами input для властивостей, визначених у класі Order, і елементами для всіх об’єктів Product у БД, які заповнюватимуться замовленою кількістю під час редагування наявних об’єктів.

Для полегшення доступу до замовлень, додамо посилання в меню, для цього змінимо вміст Views / Shared / _Layout.cshtml, таким чином:

Запустіть додаток, переконайтеся, що форма замовлення відображається коректно:

asp.net core mvc orders

Збереження даних замовлення

Клацання на кнопці Зберегти не призводить до збереження будь-яких даних, тому що метод AddOrUpdateOrder() залишився незавершеним. Перейдемо в контролер Orders і допишемо цей метод:

Оператори в методі дії покладаються на зручну функціональну особливість Entity Framework Core: у разі передавання об’єкта Order методу AddOrder() або UpdateOrder() сховища інфраструктура Entity Framework Core збереже не тільки цей об’єкт Order, а й пов’язані з ним об’єкти OrderLine. Зазначена особливість може не виглядати важливою, але вона спрощує процес, який інакше вимагав послідовності ретельно скоординованих оновлень.

Щоб переглянути SQL-команди, що генеруються, запустіть додаток і виконайте додавання одного замовлення, з 2-3-ма товарами:

Перша команда зберігає об’єкт Order, а друга отримує значення, призначене первинному ключу. Далі EF використовується первинний ключ об’єкта Order для збереження об’єктів OrderLine.

Останній момент, який потрібно відзначити, стосується наступного оператора:

Оператор виключає будь-який об’єкт OrderLine, для якого не було вибрано ненульову кількість, окрім об’єктів, що вже зберігаються в БД. Це гарантує, що БД не переповниться об’єктами OrderLine, які не є частиною якогось замовлення, але дозволяє вносити зміни в раніше збережені дані.

Після збереження даних відобразиться зведення за замовленням:

asp.net core order details

Підсумок

У розділі модель даних GameStore було розширено за рахунок додавання нових класів і створення відносин між ними. Ви дізналися, як запитувати пов’язані дані, яким чином виконувати оновлення. У наступному розділі буде показано, яким чином пристосувати частини MVC і Entity Framework Core до роботи з великими обсягами даних.

На цьому стаття “Магазин на Asp.Net Core MVC EF”, підійшла до кінця, сподіваюся вам було цікаво. Ви можете завантажити вихідний код у моєму репозиторії – Github.

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

Так само вам може бути цікава попередня стаття:

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


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

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

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

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

https://dijix.com.ua

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


 

Published inAsp.Net Core
Підписатися
Сповістити про
guest
0 комментариев
Вбудовані Відгуки
Переглянути всі коментарі
0
Ми любимо ваші думки, будь ласка, прокоментуйте.x