Интервью с Джереми Ликнессом о Entity Framework Core

от автора

Entity Framework (EF) Core — это опенсорсная кроссплатформенная расширяема технология доступа к базам данных (ORM) для .NET. Ее релиз состоялся в 2016 году вместе с первыми версиями .NET Core и ASP.NET Core — одним из самых важных шагов Microsoft в рамках вывода .NET в мир открытого исходного кода. С тех пор EF Core не прекращала развиваться вместе с .NET Core, достигнув своей нынешней формы: мощного и легковесного .NET ORM. 

InfoQ взял интервью у Джереми Ликнесса, руководителя группы проектов .NET Data в Microsoft, целью которого было узнать больше об EF Core и о том, что нам следует ожидать в следующем релизе, который намечен на конец этого года.

InfoQ: Не могли бы вы немного рассказать нам о EF Core и о том, как она развивалась с момента запуска .NET Core? 

Джереми Ликнесс: EF Core — это кроссплатформенная реляционная ORM для .NET, которая поддерживает большинство популярных баз данных, используемых сегодня разработчиками: от SQL Server и SQLite до MySQL, PostgreSQL и даже Azure Cosmos DB. Она предоставляет функции для оптимизации серверной разработки, такие как трансляция LINQ-запросов в диалект локальной базы данных, трекинг изменений и параллелизма, мутации (вставки, обновления и удаления) и управление схемами. Первоначально этот продукт увидел свет в форме Entity Framework и был создан под платформу .NET. Самая последняя версия Entity Framework — шестая (EF6), и она работает как на .NET Framework, так и на .NET Core. Основная цель состояла в том, чтобы предоставить пользователям EF6 возможность миграции на .NET Core. Первая версия EF Core была полностью переработана для того, чтобы она в полной мере могла использовать преимущества современных функций .NET, C# и облачных приложений. Да, мы намеренно не реализовывали в ней со старта 100% функционала EF6, но этот разрыв сокращается с каждым релизом. Текущая версия EF Core обеспечивает высокую производительность и почти устранила пробел в фичах по сравнению с EF6. В EF Core 5 реализованы важные фичи, такие как связь “многие ко многим”, сопоставление “таблица на тип” (TPT), разделенные запросы и инклюды с фильтрацией. В EF Core также есть фичи, которые не были доступны в EF6, среди которых можно отметить преобразования значений свойств, теневые свойства, глобальные фильтры запросов и поддержку nullable ссылочных типов.

 InfoQ: Как работает EF Core?  

Джереми: Философия, которой мы придерживались при создании EF Core, заключалась в максимальном упрощении разработки баз данных без ущерба для гибкости. Например, вы можете написать LINQ-запрос для своего приложения. Если не получается сформировать его в соответствии с вашими потребностями, или вы считаете, что его производительность не оптимальна, и вы могли бы добиться лучшего результата с SQL, то в EF Core у вас всегда есть возможность перейти на чистый SQL. EF Core построен на основе модели провайдеров. Базовый набор API предоставляет функции, охватывающие поддерживаемые базы данных. В дополнение к этому есть провайдеры, которые предоставляют набор возможностей под конкретные базы данных. Эта модель позволяет расширить EF Core для поддержки других баз данных, которые не входят в стандартную комплектацию. Интерфейсом между базой данных, EF Core и пользовательским кодом является интерфейс DbContext. DbContext поддерживает рантайм-конфигурации, поэтому его можно использовать в разных средах и с разными поставщиками. Он предоставляет набор API для определения того, какие классы будут выполнять операции управления данными в базе данных, и для настройки модели, которая определяет схему и сопоставление сущностей базы данных с вашими локальными классами. DbContext реализован в соответствии с шаблоном “Unit of Work”. Он отслеживает сущности в течение своего жизненного цикла с помощью трекера изменений (change tracker). Это дает возможность манипулировать несколькими объектами и применять изменения с помощью одной операции, что также поддерживает параллелизм. 

На мой взгляд, лучший способ разобраться в том, как работает EF Core, — это использовать представления для логирования и дебага. Логирование в EF Core 5 было упрощено, чтобы обеспечить возможность адресовать логи с помощью всего одного оператора. С помощью простой функции “LogTo” вы можете направить логи в любой метод, который принимает на вход строку, включая консоль. По умолчанию логи невероятно подробные и содержат информацию обо всем, от того, как настроен DbContext и какие модели подключены, до команд базы данных, которые принял EF Core, включая сгенерированный SQL. Можно отфильтровать логирование по серьезности и категории. Например, вы можете отбрасывать все, кроме SQL. Представления для дебага — это специальные классы в EF Core, предоставляющие подробные сведения о службе, с которой они связаны. Например, представление для дебага LINQ-запроса включает в себя сводку дерева выражений и SQL, который будет сгенерирован из LINQ. Представление для дебага трекера изменений показывает его внутреннее состояние, в том числе то, какие объекты изменены или помечены на удаление, а также их значения их ключей.

Лично для меня наиболее увлекательной областью является код, который транслирует LINQ-запросы. Он анализирует дерево выражений, представляющее запрос, и переводит его в SQL. Он достаточно интеллектуален, чтобы брать определенные локальные функции, например, для манипуляции со строками, и переводить их в соответствующие функции базы данных, а также предупреждать, когда выражение не поддерживается или не может быть транслировано. Конвейер запросов не ограничивается формированием запроса — он также должен иметь возможность парсить результаты и материализовывать их на основе исходного LINQ, который мог использовать проекции для формирования данных с использованием анонимных типов. EF Core поддерживает несколько типов CLR для сущности, поэтому можно, например, проецировать результат в словарь и передавать данные в виде наборов свойств вместо использования определенного класса.

InfoQ: Корпорация Майкрософт перешла на управляемый сообществом релиз фич для .NET 6.  Актуально ли то же самое и для EF Core? Если да, то какие фичи из предстоящего релиза были наиболее востребованы? 

Джереми: EF Core очень сильно ориентирована на сообщество, и все наши релизы содержат пул-реквесты, инициированные сообществом. Мы максимально открыты в нашем планировании, регулярные публикуем наш роадмап и отчеты о состоянии дел. Высокоуровневый план для EF Core 6.0 основан на наиболее востребованных фичах и доступен здесь. Эти фичи включают в себя: 

  • Поддержка временных (“point in time”) таблиц.

  • Общий механизм для работы со JSON-столбцами в разных провайдерах.

  • Скомпилированные модели для повышения производительности запуска.

  • Почти догнали Dapper по производительности на основе бенчмарка TechEmpower (в частности, бенчмарка Fortunes).

  • Обновления обработчика запросов для достижения 100% соответствия с EF6.

  • Улучшения миграции для упрощения управления базами данных в облачных и распределенных приложениях.

Вы можете отслеживать наш прогресс (разбитый по предварительным версиям), прочитав “Что нового в EF Core 6.0”. 

InfoQ: Производительность, кажется, является повторяющейся темой во всех релизах, ожидаемых в этом году. Можно ли ожидать этого и от EF Core 6?   

Джереми: Конечно! Мы поставили перед собой очень амбициозную цель — добиться производительности Dapper по бенчмарку Fortunes. Это очень амбициозно, потому что Dapper — это легковесный инструмент, оптимизированный для быстрых запросов, его еще часто называют “микро ORM”. EF Core намеренно идет на дополнительные накладные расходы, чтобы улучшить процесс разработки. Например, в отличие от Dapper, EF Core позволяет писать запросы с помощью LINQ. Это позволяет избежать строк, которые тяжело рефакторить, и дает строгую типизацию для разработки и проверки во время компиляции. Хотя многие из наших клиентов используют и EF Core, и Dapper в одном приложении, было бы неплохо предоставить им возможность не использовать лишнюю зависимость, если они используют Dapper только для повышения производительности запросов. Команда усердно работала над различными оптимизациями производительности, и я рад сообщить, что по состоянию на последний статус апдейт (вы можете следить за ними здесь) 22 апреля бенчмарк EF Core 6 TechEmpower Fortunes на 33 % быстрее, чем EF Core 5 и составляет 93% производительности Dapper. Разрыв значительно сократился, и мы с оптимизмом смотрим на то, что еще больше повысим производительность перед релизом EF Core 6. С другой стороны, команда Dapper тоже продолжает улучшать свои показатели, так что мы метим в движущуюся цель. Конечно, улучшения производительности в обоих продуктах приносят пользу всем участникам экосистемы, так что мы более чем рады занять второе место в этой гонке.

InfoQ: Прошло несколько месяцев с момента релиза EF Core 5 (ноябрь 2020 г.). Как его восприняли .NET-разработчики?  

Джереми: Я получил исключительно положительные отзывы. EF Core 5 включает в себя несколько востребованных фич, в том числе связь “многие ко многим”, сопоставление “таблица на тип”, разделенные запросы и инклюды с фильтрацией. Я постоянно слышу в разговоре с разработчиками: “Я был разочарован тем, что EF Core не поддерживает <вставьте название фичи сюда>, но это было исправлено в EF Core 5”. Я показал демо новых возможностей на нескольких виртуальных встречах и конференциях и получил весьма положительные отзывы. Но следует отметить, что я всегда заинтересован в любых отзывах, чтобы лучше понять, как мы можем улучшить продукт. Я призываю читающих это разработчиков, которые используют EF Core, связаться со мной в GitHub или Twitter и поделиться своим опытом. Разработчики, с которыми я уже успел пообщаться, рассказали, что переход на EF Core 5 был простым, и они сразу же увидели прирост в производительности и преимущества новых фич. Если это идет в разрез с вашим опытом, сообщите нам, чтобы мы могли решить эту проблему, будь то изменение кода, помощь в поиске нужной информации или обновление нашей документации, чтобы сделать ее более понятной.

InfoQ: Согласно официальной документации, EF Core 6.0 будет идти рука об руку с .NET 6 в качестве LTS-релиза. Учитывая критические изменения по сравнению EF Core 5, следует ли новым пользователям использовать EF Core 5 (и выполнить миграцию позже) или им следует начать с предварительных версий EF Core 6?

Джереми: Команда EF Core стремится свести к минимуму критические изменения и сделать процесс обновления максимально простым. Мы документируем все критические изменения для каждого релиза. Даже наши ночные сборки получают тот же уровень контроля качества и тщательного тестирования, что и наши финальные версии. Мы рекомендуем использовать последнюю версию, которая поддерживает необходимые вам функции. В EF Core 5 так много важных функций, что я не могу найти причину, почему бы вам не следовало использовать его. Я также поощряю раннее внедрение предварительных версий, когда это возможно. Это не только дает вам доступ к новейшим фичам и улучшениям производительности, но также дает нам возможность решить любые проблемы, которые могут возникнуть до финального релиза. Как мы говорим в наших обновлениях статус апдейтах, “чем раньше мы получим такие отзывы, тем больше вероятность того, что они повлияют на следующий официальный релиз”.

InfoQ: В каких сценариях вы бы рекомендовали использовать EF Core?

Джереми: Я явно предвзят в этом вопросе, но я считаю, что EF Core — это оптимальное решение для большинства бизнес-приложений .NET, которые работают с реляционной базой данных. В невероятно просто освоиться, но он также предлагает расширенные возможности, такие как миграция, трекинг изменений и обнаружение параллелизма, которые становятся необходимостью для больших приложений. По большей части накладные расходы на производительность минимальны и являются более чем приемлемым компромиссом при переходе от чистого SQL и манипулирования строками к строго типизированной модели программирования. Но все же есть несколько исключений. Несмотря на то, что мы активно боремся за производительность на всех поддерживаемых платформах, на мобильных платформах еще многое предстоит сделать в рамках оптимизации EF Core и ограничений в модели приложения. Конечно преимущества в использовании его с мобильными устройствами есть, но я бы советовал вам самим оценить производительность на раннем этапе разработке и сравнить ее с решениями для мобильных устройств, такими как Sqlite.NET. Приложения Blazor WebAssembly не имеют прямого доступа к большинству портов и протоколов баз данных, поэтому нет смысла использовать их там (кроме как на сервере). Если ваше приложение в основном предназначено только для чтения и не предоставляет полный набор операций создания/чтения/обновления/удаления (CRUD), Dapper может быть более подходящим решением.

Если вы ориентируетесь на Azure Cosmos DB, то тут вас поджидают некоторые нюансы. Наш провайдер реализует все базовые встроенные возможности, но не поддерживает все функции, существующие в нативном SDK. Мы документируем все ограничения, связанные с Cosmos, здесь. Провайдер позволяет очень легко начать работу, поэтому я рекомендую его, если на вас не влияют эти ограничения. Особую пользу вы извлечете, если ваша команда разработчиков уже знакома с EF Core, а также в сценариях, включающих несколько бэкендов. Например, у команды Microsoft есть Azure Function, которая принимает данные и распространяет их как на SQL Server, так и на Azure Cosmos DB. Они используют EF Core для повторного использования одного и того же DbContext для отправки изменений в обе базы данных. Если вам нужны более продвинутые возможности, изучите нативный SDK и, пожалуйста, зарегистрируйте issue или проголосуйте за существующее, чтобы мы могли определить приоритеты нужных функций для будущих релизов.

InfoQ: Где наши читатели могут начать изучать EF Core и как использовать его в своих проектах?

Джереми: Наша команда постоянно работает над улучшением и обновлением официальной документации. Если вы начнете с нашей главной страницы, вы найдете набор “карточек”, которые помогут вам в вашем путешествии. Карточка “Разработайте свое первое приложение” содержит ссылки на пошаговые руководства для различных платформ, включая веб-приложения, WPF и Xamarin. Есть карточки для баз данных и для платформ. Уровень варьируется от вводного, такого как наша статья “Начало работы с EF Core”, до продвинутой документации, такой как страница, посвященная дебагу трекера изменений. Мы хотим, чтобы это был золотой стандарт для понимания EF Core, поэтому, если читатель обнаружит, что чего-то не хватает, мы хотим, чтобы он сообщил о проблеме, чтобы ее можно было решить. Если вам больше подходит видео, раз в две недели мы проводим EF Core Community Standup, где освещаем различные темы, связанные с данными, включая подробные обзоры и демо EF Core. Вы можете получить доступ к записям прошлых стендапов.

Материал подготовлен для будущих студентов курса «C# ASP.NET Core разработчик»


ссылка на оригинал статьи https://habr.com/ru/company/otus/blog/652389/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *