Entity Framework Core

  • Tutorial
Привет, друзья. В этот чудесный майский день мы продолжаем трудиться и сегодня хотим рассказать о том, что в мае OTUS запускает полюбившийся всем курс «Разработчик С#», а также отдельный курс по С# ASP. NET Core. Традиционно, в преддверии старта курсов начинаем публиковать полезный материал. Поехали.




Вступление


В большинстве современных ASP NET Core приложений используется Entity Framework Core. Entity Framework Core – это технология для доступа к базам данных от Microsoft. Оно позволяет взаимодействовать с СУБД с помощью сущностей (entity), то есть классов и объектов NET, а не таблиц базы данных. Это самый известный и функциональный ORM – инструмент в C#. ORM — это object-relational mapping — отображение данных на реальные объекты.

Например, если разработчик напрямую работает с базами данных, программист должен думать о подключении, подготовке SQL и параметров SQL, как отправлять запросы и о транзакциях. А с помощью Entity Framework Core все это делается автоматически — разработчик работает непосредственно с классами NET.

Подходы ORM


У ORM есть несколько подходов.

Первый – Code First. Он подразумевает, что сначала пишется код на C#, а потом по этому коду создается база данных. Для этого подхода очень важно определить классы модели или entity, которая будет храниться в базе данных, описать ее в классах C# в виде модели, и написать класс контекста, который и будет работать с используемой базой данных. Подход Code First используется чаще всего программистами C#.

Второй подход — Database-First- подходит для тех, кто хорошо знает SQL, но в этом случае необязательно хорошо знать C#. Первым делом создается база данных, затем генерируется EDMX-модель базы данных. В этом XML в файле .edmx содержится информация о структуре базы, модель данных и маппинг их друг на друга. В Visual Studio есть графический дизайнер, с помощью которого можно работать с .edmx

Model-First – это третий подход ORM. Его часто используют архитекторы, так как при этом подходе можно не знать ни SQL, ни синтаксис C#. В этом случае сначала создается графическая модель EDMX, в это время в фоновом режиме создаются классы C# модели, а затем генерируется база данных на основе диаграммы EDMX.

Модели Entity Framework Core


Все таблицы базы данных определяются в Entity Framework в виде классов моделей или сущностей (entity), как правило, по принципу 1 таблица, например users, – 1 класс в NET, например, User. Такие пары называют условностями, и они определены в классе контекста данных как наборы DbSet и такой подход работает по умолчанию.

Хотя существуют такие механизмы, такие как Fluent API и аннотации данных, возможно переопределить эти условности или дополнительные правила конфигурации.

Миграции


В процессе разработки вполне вероятна ситуация, что класс модели Entity Framework изменился, и приходится удалять и базу данных, чтобы сохранялось соответствие модели. Но при удалении базы данных удаляются и все данные из нее.

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

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

LINQ


С Entity Framework в NET неразрывно связан и LINQ. LINQ — это Language Integrated Query или Внутриязыковой запрос — это такая технология, которая представляет собой набор функций в NET, которые позволяют писать структурированные запросы к базе данных.

Для работы с Entity Framework Core использует технологию LINQ to Entities. LINQ использует похожие на SQL выражения языка C# для получения данных из базы данных. Любая реляционная база данных работает через запросы на языке SQL, и Entity Framework Core выражения LINQ to Entities транслирует в запросы SQL, которые понятны для используемой базы данных.

Заключение


Таким образом мы кратко пробежались по возможностям Entity Framework Core. Как вы увидели, он действительно очень мощный, причем настолько, что программисту, который с ним работает даже не обязательно знать SQL. И Entity Framework Core по праву принадлежит первое место среди ORM в мире NET.






OTUS. Онлайн-образование
Цифровые навыки от ведущих экспертов

Похожие публикации

Комментарии 17

    0

    "Такие пары называют условности"


    Это перевод?

      +4

      Получилось достаточно кратко. Не будет лишним упомянуть, хотя бы в комментариях, ORM для .NET и .NET Core без change tracking, которая отличается лучшей производительностью — linq2db. В связке с чем-нибудь наподобие FluentMigrator в некоторых случаях может заменить EntityFramework. Ещё есть Dapper, но это инструмент более низкоуровневой категории.

        0
        AsNoTracking() — не то ли что есть и в ef core?
          0
          Incidentally, further on in the SO post, someone makes a comment about setting AutoDetectChangesEnabled and LazyLoadingEnabled to false. This has no effect on the performance (or lack thereof, at least in EF Core.)

          AsNoTracking в EFCore выключит отслеживание изменений, но на производительность не повлияет, судя по замерам и выводам из статьи Choose Your Poison on the rPi: Entity Framework, Linq2DB, or ADO.NET. Причём в секции Querying Large Sets of Data есть ещё более интересные графики. Любопытно, как там linq2db умудряется работать быстрее, чем ADO.NET. Скорее всего, linq2db делает хитрые оптимизации, а код автора — нет.


            +1

            Не все упирается в выборку, хотя тут linq2db даст фору по качеству SQL.
            Например изменение записи в EF это два обращения к базе данных, и то желательно в транзакции.


            • Достать обьект из базы полностью
            • Изменить свойство
            • SaveChanges

            В linq2db это однин стейтмент и ничего на клиент тянуть не пришлось


               db.Products
                 .Where(p => p.ProductId == dto.ProductId)
                 .Set(p => p.SoldDate, () => Sql.CurrentTimestamp)
                 .Set(p => p.IsSold, true)
                 .Update();

            Конечно возможно приаттачить обьект к ChangeTracker, только делают это редко.
            Также из примера видно что мы использовали текущую дату сервера. Что в EF проблематично.


            Вот из таких кирпичиков и растет перформанс. Чем дальше мы от SQL, тем больше мы полагаемся на архитектуру всемогутора, а она не всегда эфективна.

          +1

          В EF.core (насколько я помню) многие-ко-многим без ручной реализации расшивочной таблицы так и не завезли.


          Традиционно, в преддверии старта курсов начинаем публиковать полезный материал.

          а где, собственно, полезный материал ?

            0
            Да правы, буквально вчера реалзовывал такую связь на ef 3.1, ну а как по другому? SQL то, он не меняется так быстро как кор:)
              0

              Дело не в SQL, в EF это было из коробки (на самом деле есть во многих ORM'ах).
              (я понимаю что это синтаксический сахар и в SQL всё также используется расшивочная таблица)


              На MSDN есть табличка с разницей между EF и EF.core https://docs.microsoft.com/ru-ru/ef/efcore-and-ef6/
              Навигация "многие ко многим": EF(Да), (EF.core) Запланировано на 5.0 (#19003)

                0
                ух
                ну было бы круто. Потому что запросы порой нечитабельные получаются при многих ко многим на linq, может это как-то исправит дело
            +1
            Вводная статья в EF в 2020 году на Хабре?
              0
              О чем статья? Введение во вводную статью?
                0

                О платном курсе, что скоро начинается.

                +3
                Интересно, ваши курсы настолько же полезны как и эта статья?
                  –4

                  У Вас есть прекрасная возможность записаться на бесплатный урок и проверить)

                  0

                  А точно в Ef.Core завезли поддержку Edmx? Вроде всегда декларировалось, что этого не будет потому, что не будет никогда....

                    0

                    На MSDN, говорят что не запланировано https://docs.microsoft.com/ru-ru/ef/efcore-and-ef6/
                    Формат модели: (EF) — EDMX (XML) Да, (EF.core) — Поддержка не запланирована (2)


                    2 Некоторые функции EF6 не будут реализованы в EF Core. Эти функции зависят от базовых EDM EF6 и (или) являются сложными функциями с относительно низкой рентабельностью инвестиций. Мы всегда приветствуем обратную связь, но несмотря на то, что EF Core предоставляет многие функции, недоступные в EF6, для EF Core, наоборот, невозможно поддерживать все функции EF6.

                      0

                      Вот и я про то же. Потому и удивился.

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое