5.20M
Категория: ПрограммированиеПрограммирование

Data Access Layer. Entity Framework Core

1.

Data Access Layer
Entity Framework Core
Самарин Дмитрий

2.

Содержание
Что такое OOA и OOD
Построение модели
Что такое ORM
EntityFramework Core
Миграции
DataAnnotations и FluentApi
Работа с связанными данными
2

3.

Встраиваемые и клиент-серверные СУБД
Встраиваемые СУБД
Клиент-Серверные СУБД
1.
Состоят из одного файла на диске
1.
Состоят из клиента и сервера
2.
Нет системы пользователей
2.
Разграничение доступа между пользователями
3.
Работают очень быстро, так как это по факту
3.
Клиент-серверная технология, то есть будут сетевые
задержки
просто файл на диске
4.
Плохо масштабируемы
4.
Легко масштабируемы
5.
Решение для тестирования или для работы
5.
Возможна запись больших объемов данных
клиента с локальными данными
MS SQL Server, PostgreSQL, Oracle Database
SQLite
3

4.

ООА, OOD, ООР
Объектный подход (OOP) является концептуальной основой OOD (проектирование), который используют в качестве методов ООА
(анализ), а в качестве инструмента – ООР (программирование).
ООА (объектно-ориентированный анализ) направлен на создание моделей, более близких к реальности, с использованием объектных
абстракций, которые составляют словарь предметной области.
Цели: определение объектов, свойств, отношений между объектами, сценарии использования.
OOD (объектно-ориентированное проектирование) – это метод проектирования, соединяющий в себе проектирование объектной
декомпозиции и приемы различных представлений предметной области (логическая и физическая модель, статическая и
динамическая модель).
Цели: определение данных, которые необходимо сохранять, определение объектов, свойств и создание диаграммы классов.
Как соотносятся ООА, OOD и OOP?
На результатах ООА формируются модели, на которых основывается OOD, OOD в свою очередь создает фундамент для окончательной
реализации системы с использованием методологии OOP.
4

5.

ORM
ORM (Object-Relational Mapping)
ORM – объектно-ориентированная технология доступа к данным. Позволяет связать базу данных с концепцией ООП,
создавая виртуальную объектную базу данных.
В общих чертах, технология ORM позволяет проектировать работу с данными в терминах классов, а не таблиц данных.
Она позволяет преобразовывать классы в данные, пригодные для хранения в базе данных, причем схему преобразования
определяет сам разработчик.
ORM используется для упрощения процесса сохранения объектов в реляционную базу данных и их извлечения, при этом
ORM сама заботится о преобразовании данных между двумя несовместимыми состояниями.
5

6.

ORM
Преимущества и недостатки
Преимущества:
• Ускорение разработки - устраняет необходимость в повторяющемся коде SQL
• Сокращает время разработки
• Снижает затраты на разработку
• Преодолевает специфические для поставщика различия SQL - ORM знает, как писать специфический для
поставщика SQL-код, поэтому вам не нужно.
Недостатки:
• Потеря производительности разработчика, в то время как они учатся программировать с помощью ORM
• Разработчики теряют понимание того, что на самом деле делает код - разработчик больше контролирует
использование SQL
• ORM имеет тенденцию быть медленным
• ORM не может конкурировать с SQL-запросами для сложных запросов
6

7.

ORM
ORMs for .NET
Linq2Sql
LINQ to SQL — это реализация ORM начального уровня от Microsoft на основе LINQ, предназначенная для работы с SQL Server.
Dapper
Dapper представляет собой технологию сопоставления (маппинга) результатов sql-запросов с классами c#. В этом плане Dapper немного похож
на Entity Framework. В то же время за счет своей легковесности Dapper обеспечивает большую производительность и быстрее позволяет
выполнять запросы, нежели Entity Framework.
NHibernate
NHibernate — ORM-решение для платформы Microsoft .NET, портированное с Java, позволяет отображать объекты бизнес-логики на
реляционную базу данных. По заданному XML-описанию сущностей и связей NHibernate автоматически создает SQL-запросы для загрузки и
сохранения объектов.
Entity Framework (Entity Framework Core)
Entity Framework Core (EF Core) представляет собой объектно-ориентированную, легковесную и расширяемую технологию от компании
Microsoft для доступа к данным.
7

8.

EF Core. Взаимодействие с БД
8

9.

EF Core. Взаимодействие с БД
Основу функциональности EF для работы
Microsoft.EntityFrameworkCore, в особенности:
с
БД
составляют
классы
из
пространства
имён
DbContext – определяет контекст данных. Используется для взаимодействия с БД;
DbSet<TEntity> - представляет набор объектов, хранящихся в БД;
DbContextOptionsBuilder – конфигурация параметров подключения.
Все сущности, с которыми работает Entity Framework, определяются в виде классов моделей. При этом EF Core
использует ряд условностей для сопоставления классов моделей с таблицами.
По умолчанию все типы сущностей, для которых определены в контексте данных наборы DbSet, включаются в
модель и в дальнейшем сопоставляются с таблицами в базе данных. А их открытые свойства становятся полями в
таблице.
Однако с помощью таких механизмов, как Fluent API и аннотации данных мы можем добавить дополнительные
правила конфигурации, либо переопределить используемые условности.
9

10.

EF Core. Взаимодействие с БД
DBContext - самый важный класс, по факту он вместе с другими возможностями EF Core является подключаемым
DataAccess уровнем и реализует много паттернов:
• Repository
Посредничает между уровнями области определения и распределения данных (domain and data mapping layers),
используя интерфейс, схожий с коллекциями для доступа к объектам области определения.
• Unit of Work
Обслуживает набор объектов, изменяемых в бизнес-транзакции (бизнес-действии) и управляет записью изменений
и разрешением проблем конкуренции данных.
Когда необходимо писать и читать из БД, важно следить за тем, что вы изменили и если не изменили - не записывать
данные в БД. Также необходимо вставлять данные о новых объектах и удалять данные о старых.
Реализация паттерна Unit of Work следит за всеми действиями приложения, которые могут изменить БД в рамках
одного бизнес-действия. Когда бизнес-действие завершается, Unit of Work выявляет все изменения и вносит их в БД.
10

11.

EF Core. Отношения между моделями
Для связей между моделями в Entity Framework Core применяются внешние ключи и навигационные свойства.
Виды отношений:
• Отношение один к одному (one-to-one) - главная сущность может ссылаться только на один объект
зависимой сущности. В свою очередь, зависимая сущность может ссылаться только на один объект главной
сущности;
• Отношение один ко многим (one-to-many) - представляет ситуацию, когда одна модель хранит ссылку на
один объект другой модели, а вторая модель может ссылаться на коллекцию объектов первой модели;
• Отношение многие-ко-многим (many-to-many) – реализуется с помощью связывающей сущности
(разбивается на две связи один-ко-многим).
11

12.

EF Core. Наследование
По умолчанию при работе с цепочками наследования классов Entity Framework Core использует подход TPH (Table Per Hierarchy
/ Таблица на одну иерархию классов).
На данный момент это единственная форма работы с иерархиями классов в Entity Framework Core. При использовании данного
подхода TPH для всех классов из одной иерархии в базе данных создается одна таблица. А чтобы определить, к какому именно
классу относится строка в таблице, в этой же таблице создается дополнительный столбец - дискриминатор.
12

13.

Entity Framework подход к разработке
01
Code First – применяется при старте разработки
приложения, на данном этапе, вы без проблем можете
описать модель в виде кода и спроецировать ее на вашу
БД.
02
Database First – применяется при наличии уже готовой
базы данных, например в ситуации когда вы захотели
плавно перейти от прямого вызова к ORM (работа с
проектом при разработке которого не применялся
ORM) – не актуально
03
Model First – Суть данного подхода состоит в том, что
сначала делается модель, а потом по ней создается база
данных – не актуально
13

14.

Entity Framework Core. Миграции
Модель данных в процессе разработки может измениться и перестанет соответствовать базе данных.
Миграции в EF Core позволяют последовательно применять изменения схемы к базе данных, чтобы синхронизировать ее с
моделью данных в приложении без потери существующих данных.
Миграции включают средства командной строки и API-интерфейсы, которые помогают в решении следующих задач:
• Создание миграции
• Обновление базы данных
• Настройка кода миграции
• Удаление миграции
• Отмена миграции
• Создание скриптов SQL
14

15.

Entity Framework Core. Миграции
При использовании подхода Code first, миграции позволяют
вносить изменения в БД при изменениях моделей и контекста
данных.
Класс миграции содержит два метода Up() и Down().
Также для миграций хранится отпечаток (snapshot) состояния
контекста.
История миграций хранится в таблице __EFMigrationHistory.
15

16.

Работа с миграциями из PowerShell
Add-Migration <Имя миграции> - добавляет новую миграцию
в папку Migrations.
Remove-Migration - удаляет последнюю миграцию из папки
Migrations.
Update-Database – Применяет последнюю миграцию.
16

17.

Работа с миграциями из командной строки
Необходимо установить инструменты для работы с EF:
Целевой проект и запускаемый проект
dotnet tool install --global dotnet-ef
Команды ссылаются на проект и запускаемый проект.
dotnet add package Microsoft.EntityFrameworkCore.Design
Проект также называется целевым проектом , так как он служит для
добавления или удаления файлов. По умолчанию проект в текущем
каталоге является целевым. Можно указать другой проект в качестве
целевого проекта с помощью параметра --project .
Добавление миграции:
dotnet ef migrations add <Имя миграции>
Удаление последней миграции:
dotnet ef migrations remove
Применение последней миграции:
dotnet ef database update
Запускаемый проект — это тот, который выполняет сборка и запуск
средств. Средства должны выполнять код приложения во время
разработки для получения сведений о проекте, таких как строка
подключения к базе данных и Конфигурация модели. По умолчанию
проект в текущем каталоге является запускаемым проектом. Можно
указать другой проект в качестве запускаемого проекта с помощью
параметра --startup-project .
17

18.

Data Annotations и Fluent API
Data Annotations
Fluent API
Набор классов-атрибутов, которые можно применять
к сущностям, свойствам, полям непосредственно в
доменной модели.
Набор методов, позволяющий определить правила
сопоставления между классами и таблицами. Для
использования, необходимо в классе контекста БД
переопределить метод OnModelCreating.
18

19.

Загрузка связанных данных
Ленивая загрузка (Lazy load)
Жадная загрузка (Eager load)
Явная загрузка (Explicit load)
При использовании связанные
сущности запрашиваются при первом
обращении к навигационному свойству.
При использовании необходимо указать
сущности, которые необходимо
загрузить сразу. С использованием
метода Include().
При использовании связанные
сущности запрашиваются, только если
они явно подключены при помощи
метода Load().
Навигационное свойство должно быть
объявлено с модификатором virtual.
Для EF Core дополнительно требуется
установка NuGet-пакета
Microsoft.EntityFrameworkCore.Proxies.
И использование метода
UseLazyLoadingProxies() в конфигурации
контекста.
При жадной загрузке формируется один
запрос к БД, который вернёт
запрашиваемые даные.
Универсального решения о выборе между ленивой/явной и жадной загрузке - нет.
Загружать много редко используемой информации (особенно часто изменяемой) - не эффективно, еще более не эффективно
использовать n+1 запросов вместо одного, так как ленивая загрузка будет означать выполнение отдельного запроса для каждого
объект.
19
English     Русский Правила