Skip to content

Latest commit

 

History

History
133 lines (106 loc) · 17.4 KB

EF-Core-MVC.md

File metadata and controls

133 lines (106 loc) · 17.4 KB

← EF Core

EF Core с MVC

Учебник по работе с ASP.NET Core 2.0 MVC и EF Core

В проекте используется Net Core 3.1, что то приходится подправить, на основе руководства по EF Core с Razor Pages.
Классы модели данных в точности такие же, как и для Razor Pages.

При добавлении класса SchoolContext требуется добавить в приложение несколько пакетов с помощью NuGet: ссылку на общий пакет Microsoft.EntityFrameworkCore -- не добавлять.

Добавить те же пакеты, что и в приложении EF Core с Razor Pages

Установка пакетов Nuget для EF Core 3.1 с MVC

  • Настройка страницы сведений: представление Details для отображения списка Enrollments;
  • Обновление страницы Create: настройка обработчика сбоев, защита от чрезмерной передачи данных;
  • Обновление страницы редактирования: настройка HttpPost Edit, защита от чрезмерной передачи данных, вариант с предварительным чтением данных. Альтернативный код метода HttpPost Edit: создание и подключение.
  • Обновление страницы удаления: обработка ошибок, изменение метода GET для отображение ошибки сохранения. Подход с предварительным чтением для метода HttpPost Delete.
  • Управление БД: закрытие подключений. Обработка транзакций: По умолчанию платформа Entity Framework реализует транзакции неявно. Если нужен дополнительный контроль, то см. в разделе Транзакции.
  • Отключение отслеживания запросов: метод .AsNoTracking()

  • Добавление ссылок для сортировки столбцов
  • Добавление поля поиска. Особенности работы при наличии слоя репозитария. Особенности оптимизации SQL сервера при учете регистра строк.
  • Разбиение по страницам. Учет фильтрации и сортировки при разбиении по страницам
  • Создание страницы сведений. Группировка и расчеты.
  • Создание первоначальной миграции. Чтобы избежать ошибок, воспользуйтесь командами PowerShell как в руководстве Razor Pages EF. Первая команда Add-Migration InitialCreate создаст файлы миграции, в вторая Update-Database создаст новую БД SchoolContext2
  • Далее вернитесь к исходному руководству Обзор методов Up и Down. Параметр имени миграции (в примере это "InitialCreate") используется в качестве имени файла и может быть любым.
  • Из Razor Pages EF: Таблица журнала миграции в базе SQL, Моментальный снимок модели данных
  • Удаление миграции. Сначала надо откатить базу до предыдущей миграции, я сделал это в PowerShell командой Update-Database -Migration 0 -- таблицы, созданные предыдущей миграцией, удаены из БД. Для удаления файлов миграции из проекта я выполнил команду Remove-Migration

* Настройка модели данных с помощью атрибутов.

Если вы не делали миграции для БД, то сначала разберитесь с миграциями. Придется вернутся к первоначальным данным, которые задаются в классе DbInitializer (namespace ContosoUniversityMVC.Data).
Итак: Обнулите все миграции Update-Database -Migration 0, откройте БД и удалите оставшиеся таблицы, сначала таблицу связей Enrollment потом Course и Student.
Если вы уже редактировали атрибуты, то закоментируйте все атрибуты и создайте первоначальную миграцию Add-Migration InitialCreate, примените миграцию к БД Update-Database - будут созданы пустые таблицы. Запустите приложение, и таблицы заполнятся из класса DbInitializer.
Добавьте атрубуты к классу Student и создайте миграцию Add-Migration MaxLengthOnNames -- убедитесь, что миграция нацелена на обновление таблиц. Обновите базу Update-Database и проверьте изменения в схеме таблицы Student.

  • Связи "многие ко многим"
    Составной ключ - добавляется в классе SchoolContext (namespace ContosoUniversityMVC.Data).
  • Добавление миграции Создание данных-заглушек в базу данных для соблюдения ограничений внешнего ключа. Поскольку создан новый файл первичных данных DbInitializer, то для тестирования используем новую БД.

  • Загрузка связанных данных. Безотложная загрузка, Явная загрузка, Отложенная загрузка.
    На странице "Instructors" (Преподаватели) отображаются данные из трех различных таблиц, для этого создается отдельный класс модели отображения.

  • Добавление списка выбора на основе SelectList
  • Добавление .AsNoTrackin в методы Details и Delete
  • Настройка страниц Курсов. Добавление страницы редактирования данных о преподавателях. Добавление курсов на страницу редактирования. Обновление страницы удаления.
  • Добавление расположения кабинета и курсов на страницу создания
  • Пессимистичный параллелизм (блокировка) - EF Core не поддерживает,т.к. требует много ресурсов, используется оптимистическая блокировка. Варианты: отслживание изменений записи разными пользователями; победа клиента - сохранение последнего внесенного изменения; победа хранилища - если запись изменена другим пользователем (два пользователя одновременно редактируют запись), то будет сообщение об ошибке.
    Данный метод гарантирует, что никакие изменения не перезаписываются без оповещения пользователя о случившемся - он и используется в примере.
  • Обнаружение конфликтов параллелизма - обработки исключений DbConcurrencyException - требует настройки БД и модели. В БД включаетя столбец отслеживания rowversion, он изменяется при каждом обновлении, и включается в запрос UPDATE или DELETE как часть предложения WHERE.
  • Создание представлений и контроллера кафедр. Обновление страницы удаления. Обновление представлений Details и Create.

Изменения вносятся в коде, а не на веб-страницах, и автоматически отражаются в базе данных. Платформа Entity Framework поддерживает только модель наследования "одна таблица на иерархию". Необходимо создать класс Person, изменить классы Instructor и Student так, чтобы они были производными от класса Person, добавить новый класс в DbContext, после чего создать миграцию.

⚠ ВНИМАНИЕ! Опечатка в документации:
из класса SchoolContext в методе OnModelCreating(ModelBuilder modelBuilder) закомментируйте 2 строки с классами Student и Instructor, надо оставить только одну таблицу Person вместо двух прежних. При миграции будет предупреждение о потере данных.

  • Выполнение прямых SQL-запросов
    ⚠ ВНИМАНИЕ! Вызов запроса для получения сущностей, устаревший метод:
    Меод .FromSql(query, id) не поддерживается, надо использовать .FromSqlRaw(query, id)
  • Вызов запроса для получения других типов
  • Вызов запроса на обновление
    ⚠ ВНИМАНИЕ! устаревший метод:
    Меод .ExecuteSqlCommandAsync устарел, надо использовать .ExecuteSqlRawAsync
    ⚠ ВНИМАНИЕ! При тестировании обновления, вы делаете обновление и переходите на страницу списка курсов, если вернуться назад, используя браузер, то можно ошибочно выполнить повторное обновление.
  • Изучение SQL-запросов -- возможность просмотреть фактические SQL-запросы, отправляемые в базу данных.
  • Создание уровня абстракции:
    ✅ Платформа EF предусматривает функции для реализации разработки на основе тестирования, не требующие написания кода репозитория.
  • Автоматическое обнаружение изменений.
    ✅ Если вы отслеживаете большое число сущностей и многократно вызываете один из методов DbContext.SaveChanges, DbContext.Entry, ChangeTracker.Entries в цикле , вы сможете добиться заметного повышения производительности, отключив автоматическое обнаружение изменений с помощью свойства ChangeTracker.AutoDetectChangesEnabled.
  • Использование динамических запросов LINQ для упрощения кода.
    ✅ Метод EF.Property используется для указания имени свойства в виде строки

Дополнительные ресурсы

📘 документации по платформе Entity Framework Core.


Практические консультации вы можете получить на наших веб курсах в Сочи, Адлер: