Skip to content

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

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

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

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


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

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

Модифікація та видалення даних

Оновлення контролера і створення подання

Оновлення тільки змінених властивостей

Виконання масових оновлень

Зміна сховища

Зміна подань і контролера

Використання засобу виявлення змін у файлі

Видалення даних

Підсумок

 

Модифікація та видалення даних

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

Інфраструктура Entity Framework Core підтримує кілька способів оновлення об’єктів. У поточному розділі ми почнемо з найпростішого прийому, за якого об’єкт, створений зв’язувачем моделей MVC, застосовується для повної заміни об’єкта, що зберігається в БД.

Насамперед змініть інтерфейс IProduct, додавши до нього методи, які можна використовувати в решті коду застосунку для витягання й оновлення наявного об’єкта:

Метод GetProduct() надасть одиночний об’єкт Product за значенням його первинного ключа. Метод UpdateProduct() отримує об’єкт Product і будь-якого результату не повертає.

Реалізуємо ці методи в класі репозиторії ProductRepository:

Об’єкт DbSet<Product>, що повертається властивістю Products контексту БД, надає функціональний засіб, який необхідний для реалізації нових методів. Метод Find() приймає значення первинного ключа і запитує у БД відповідний йому об’єкт. Метод Update() приймає об’єкт Product і застосовує його для поновлення БД, замінюючи об’єкт у БД із тим самим первинним ключем. Як і у випадку всіх операцій, які змінюють БД, після виклику Update() знадобиться викликати метод SaveChanges().

Пам’ятати про необхідність виклику методу SaveChanges() може здатися складним завданням, але це швидко увійде у звичку. Такий підхід означає, що ви можете підготувати безліч змін, викликаючи методи об’єкта контексту, і потім одночасно відправити їх БД за допомогою єдиного виклику SaveChanges().

Оновлення контролера і створення подання

Наступний крок полягає в оновленні контролера Home, щоб додати методи дій, які дадуть змогу користувачеві вибрати об’єкт Product для редагування та надіслати зміни додатку.

Додамо 2 нові дії в HomeController:

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

Подання UpdateProduct.cshtml постачає користувачеві НТМL-форму, яку можна використовувати для зміни властивостей об’єкта Product, за винятком властивості Id, що застосовується як первинний ключ. Первинні ключі нелегко змінити після того, як їх було призначено, і якщо потрібне інше значення ключа, то простіше видалити об’єкт і створити новий. З цієї причини до елемента input додано атрибут readonly, який дає змогу бачити значення властивості Id, але не змінювати його. Або поле з Id, можна взагалі приховати з очей користувача.

Для інтеграції засобу оновлення з рештою коду додатка додамо елемент button до кожного об’єкта Product, що відображається поданням Index.cshtml:

Запустіть застосунок, виберіть будь-який товар і натисніть кнопку “Змінити”:

products asp.net core

Змініть будь-яке значення на обраному товарі та натисніть кнопку “Зберегти”:

редактирование asp.net core

Якщо ви переглянете журнальні повідомлення, згенеровані додатком, то зможете побачити, як виконувані дії перетворюються на SQL-команди, що надсилаються серверу баз даних. Коли ви клацаєте на кнопці Edit, інфраструктура EntityFramework Core запитує у БД деталі обраного об’єкта за допомогою такої команди:

Метод Find(), транслюється в команду SELECT для одиночного об’єкта, який вказано з використанням ключового слова ТОР. Після клацання на кнопці Save інфраструктура Entity Framework Сare оновлює БД за допомогою такої команди:

Метод Update() транслюється в SQL-команду UPDATE, яка зберігає значення даних форми, отримані з НТТР-запиту.

Оновлення тільки змінених властивостей

Основні будівельні блоки для виконання оновлень на місці, але результат неефективний, оскільки інфраструктура Entity Framework Core не має в своєму розпорядженні вихідних даних для оцінки, що конкретно змінилося, і не має іншого вибору, крім збереження всіх властивостей. Щоб поглянути на проблему, клацніть на кнопці Edit для одного з товарів і потім клацніть на кнопці Save, не вносячи жодних змін. Хоча нові значення даних не вводилися, журнальні повідомлення, згенеровані додатком, свідчать про те, що випущена інфраструктурою EntityFramework Core команда UPDATE надсилає значення для всіх властивостей, визначених у класі Product:

Інфраструктура Entity Framework Core містить засіб виявлення змін, що здатен виявити, які властивості було змінено. Для такого простого класу моделі даних, яким є Product, користь від цього засобу невелика, але в разі складніших моделей виявлення змін може бути важливим.

Засіб виявлення змін потребує вихідних даних, з якими можна було б порівняти дані, отримані від користувача. Існують різні способи надання вихідних даних (їх описано в розділі 12), але тут буде застосовано найпростіший підхід, який передбачає запитування у БД наявних даних.

Змінимо метод UpdateProduct, класу ProductRepository, таким чином:

Код об’єднує в додатку дві різні функції. Інфраструктура Entity Framework Core відстежує зміни в об’єктах, які створює з даних запитів, тоді як зв’язувач моделей MVC створює об’єкти з НТГР-даних. Згадані два джерела об’єктів не об’єднані, і якщо не дотримуватися обережності при утриманні їх роздільними, то виникнуть проблеми. Найбезпечніший спосіб задіяти у своїх інтересах відстеження змін – запросити БД і потім скопіювати значення з НТГР-даних, як було зроблено.

Коли викликається метод SaveChanges(), інфраструктура Entity Framework Core з’ясує, значення яких властивостей змінилися, і оновить у БД тільки ці властивості.

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

Виконання масових оновлень

Масові оновлення часто потрібні в додатках, де передбачені окремі ролі адміністраторів, яким необхідно вносити зміни до безлічі об’єктів в єдиній операції. Точна природа оновлень буде варіюватися, але поширені причини для масових оновлень включають виправлення помилок у записах даних або перепризначення об’єктів у нові категорії, що може виявитися витратним за часом процесом у разі виконання на індивідуальних об’єктах. З використанням інфраструктури Entity Framework Core робити масові оновлення легко, але потрібні невеликі зусилля, щоб забезпечити їхню гладку роботу з частиною ASP.NEТ Core MVC додатка.

Зміна сховища

Додайте в інтерфейс сховища IProduct новий метод, який буде виконувати масове оновлення:

Нарешті, додайте в сховище ProductRepository реалізацію методу UpdateAll(), який буде оновлювати БД із застосуванням даних, отриманих з НТТР-запиту:

Клас DbSet<T> пропонує методи для роботи з індивідуальними об’єктами і з колекціями об’єктів. У цьому прикладі використовується метод UpdateRange(), який є аналогом методу Update(), але працює з колекціями. Коли викликається метод SaveChanges(), інфраструктура Entity Framework Core відправляє послідовність SQL-команд UPDATE для оновлення БД.

Зміна подань і контролера

Для додавання підтримки масових оновлень змініть, подання Index, включивши в нього кнопку Edit All (Редагувати все), яка націлена на дію UpdateAll. Також додайте властивість типу ViewBag на ім’я UpdateAll. Якщо її значенням є true, тоді відображатиметься часткове подання InlineEditor.cshtml:

Створіть часткове подання, додавши в папку Views/Home файл на ім’я InlineEditor.cshtml, з таким вмістом:

Часткове подання створює набір елементів форми, імена яких слідують угоді, прийнятій у МVС для колекції об’єктів, а тому властивості Id призначаються імена Products[0].Id, Products[1].Id і т.д. Встановлення імен елементів input вимагає лічильника, що породжує незграбну суміш виразів Razor і С#.

Додайте в контролер Ноmе методи дій, які дадуть змогу користувачеві почати процес масового редагування і відправити дані:

На цьому етапі структура проєкту має такий вигляд:

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

Запустіть додаток і виконайте масове редагування товарів:

asp.net core редактирование объектов

 

 

 

Використання засобу виявлення змін у файлі

У попередньому коді не застосовується засіб виявлення змін Entity Framework Core, тобто будуть оновлюватися всі властивості всіх об’єктів Product. Щоб оновлювати тільки змінені значення, змініть метод UpdateAll, у класі ProductRepository, таким чином:

Процес виконання оновлення може виглядати заплутаним. Спочатку створюється словник об’єктів Product, отриманих від зв’язувача моделей MVC, із застосуванням властивості Id для ключів. Колекція ключів використовується для запитування відповідних об’єктів у БД. Далі відбувається перерахування об’єктів БД із копіюванням значень властивостей з об’єктів НТТР-запиту. Після виклику методу SaveChanges() інфраструктура EF виконує виявлення змін і оновлює тільки ті властивості, значення яких змінилися.

Запустіть додаток і виконайте масове редагування товарів. Перегляньте журнальні повідомлення, згенеровані додатком. Порівняйте запити з різними версіями методу UpdateAll.

Видалення даних

Видалення об’єктів із БД – процес простий, хоча з розростанням моделі даних він може ускладнитися. В інтерфейс IProduct додамо такий метод:

У класі ProductRepository реалізуємо цей метод:

Клас DbSet<T> має методи Remove() і RemoveRange(), призначені для видалення одного і декількох об’єктів з БД. Як і в разі інших операцій, що модифікують БД, дані не видаляються доти, доки не буде викликано метод SaveChanges().

Додайте в контролер Home метод дії, який отримує з НТТР запиту деталі об’єкта Product, що підлягає видаленню, і передає їх сховищу:

У подання Index додамо елемент form:

Зверніть увагу, що форма містить єдиний елемент input для властивості Id. Це все, що інфраструктура Entity Framework Core застосовує для видалення об’єкта з БД, хоча операція виконується над повним об’єктом Product. Замість надсилання додаткових даних, які не планується використовувати, було надіслано тільки значення первинного ключа, яке зв’язувач моделей MVC застосує для створення об’єкта Product, залишаючи всі інші властивості рівними null або стандартному значенню для типу.

Запустіть додаток і виконайте видалення будь-якого продукту.

Підсумок

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

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

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

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

Оптимізація зображень для сайту на C#


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

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

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

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

https://dijix.com.ua

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


 

Published inAsp.Net Core
Subscribe
Notify of
guest
0 комментариев
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x