Введение в Entity Framework
Entity Framework представляет специальную объектно-ориентированную технологию на базе фреймворка .NET для работы с данными. Если традиционные средства ADO.NET позволяют создавать подключения, команды и прочие объекты для взаимодействия с базами данных, то Entity Framework представляет собой более высокий уровень абстракции, который позволяет абстрагироваться от самой базы данных и работать с данными независимо от типа хранилища. Если на физическом уровне мы оперируем таблицами, индексами, первичными и внешними ключами, но на концептуальном уровне, который нам предлагает Entity Framework, мы уже работает с объектами.
Первая версия Entity Framework — 1.0 вышла еще в 2008 году и представляла очень ограниченную функциональность, базовую поддержку ORM (object-relational mapping — отображения данных на реальные объекты) и один единственный подход к взаимодействию с бд — Database First. С выходом версии 4.0 в 2010 году многое изменилось — с этого времени Entity Framework стал рекомендуемой технологией для доступа к данным, а в сам фреймворк были введены новые возможности взаимодействия с бд — подходы Model First и Code First.
Дополнительные улучшения функционала последовали с выходом версии 5.0 в 2012 году. И наконец, в 2013 году был выпущен Entity Framework 6.0, обладающий возможностью асинхронного доступа к данным.
Центральной концепцией Entity Framework является понятие сущности или entity. Сущность представляет набор данных, ассоциированных с определенным объектом. Поэтому данная технология предполагает работу не с таблицами, а с объектами и их наборами.
Любая сущность, как и любой объект из реального мира, обладает рядом свойств. Например, если сущность описывает человека, то мы можем выделить такие свойства, как имя, фамилия, рост, возраст, вес. Свойства необязательно представляют простые данные типа int, но и могут представлять более комплексные структуры данных. И у каждой сущности может быть одно или несколько свойств, которые будут отличать эту сущность от других и будут уникально определять эту сущность. Подобные свойства называют ключами .
При этом сущности могут быть связаны ассоциативной связью один-ко-многим, один-ко-одному и многие-ко-многим, подобно тому, как в реальной базе данных происходит связь через внешние ключи.
Отличительной чертой Entity Framework является использование запросов LINQ для выборки данных из БД. С помощью LINQ мы можем не только извлекать определенные строки, хранящие объекты, из бд, но и получать объекты, связанные различными ассоциативными связями.
Другим ключевым понятием является Entity Data Model . Эта модель сопоставляет классы сущностей с реальными таблицами в БД.
Entity Data Model состоит из трех уровней: концептуального, уровень хранилища и уровень сопоставления (маппинга).
На концептуальном уровне происходит определение классов сущностей, используемых в приложении.
Уровень хранилища определяет таблицы, столбцы, отношения между таблицами и типы данных, с которыми сопоставляется используемая база данных.
Уровень сопоставления (маппинга) служит посредником между предыдущими двумя, определяя сопоставление между свойствами класса сущности и столбцами таблиц.
Таким образом, мы можем через классы, определенные в приложении, взаимодействовать с таблицами из базы данных.
Способы взаимодействия с БД
Entity Framework предполагает три возможных способа взаимодействия с базой данных:
Database first : Entity Framework создает набор классов, которые отражают модель конкретной базы данных
Model first : сначала разработчик создает модель базы данных, по которой затем Entity Framework создает реальную базу данных на сервере.
Code first : разработчик создает класс модели данных, которые будут храниться в бд, а затем Entity Framework по этой модели генерирует базу данных и ее таблицы
Entity Framework Core
Привет, друзья. В этот чудесный майский день мы продолжаем трудиться и сегодня хотим рассказать о том, что в мае 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().
С 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.
Развитие Entity Framework
При работе с реляционными базами данных мы используем таблицы со строками и столбцами, такая инфраструктура устройства баз данных является очень структурированной. Перед широким внедрением объектно-ориентированного программирования мы работали в рамках “процедурного” программирования – для решения проблем использовался структурный код и функции. Устройство баз данных в виде таблиц, строк и столбцов было в какой-то степени похоже на структурные и процедурные шаблоны программирования, которые мы использовали в нашем коде. Жизнь была хороша .
После этого произошла эволюция на стороне кода – сейчас мы уже не используем функции, а думаем в терминах объектов, классов и моделей. Процесс разработки программного обеспечения значительно повзрослел за эти годы и обрел концептуальный уровень – изменилось все, начиная от кода (появились ООП, различные фреймворки и шаблоны облегчающие жизнь) и заканчивая командами разработчиков (современный крупный проект трудно представить без архитекторов, дизайнеров, оптимизаторов и т.д.)
При этом эти изменения практически не затронули базы данных. Данные все также остаются заперты в таблицах, строках и столбцах. Это создает большую пропасть в работе между иерархическим объектно-ориентированным кодом и высоко-нормализованной структурой баз данных. Чтобы справиться с этой проблемой, разработчики предложили внести в программные проекты “объектный слой базы данных”, в котором таблицы баз данных представлялись в виде классов, столбцы в виде свойств, а вся работа с базой данных строилась на программном коде без использования SQL. Такой подход получил название .
Различные программные платформы предлагают множество систем, реализующих модель ORM. в сочетании с LINQ (Language-Integrated Query) представляет собой реализацию ORM для платформы .NET Framework от компании Microsoft. Entity Framework содержит механизмы создания и работы с сущностями базы данных через объектно-ориентированный код на языке, совместимым с CLR (в наших примерах мы будем использовать C#). LINQ представляет собой библиотеку, расширяющую возможности C#, и облегчающую создание запросов (благодаря LINQ можно создавать SQL-подобные запросы в коде C#).
Entity Framework является продолжением другого API-интерфейса для работы с базами данных в .NET – ADO.NET, в котором для работы с базами данных приходилось писать запросы на SQL и вставлять их в команды. Думаю как вы поняли, Entity Framework значительно облегчает жизнь программистам C#, слабо разбирающимся в SQL и в деталях работы с базами данных.
История развития Entity Framework
Entity Framework представляет стратегический подход Microsoft к технологии доступа к данным для построения приложений. В отличие от предыдущих технологий доступа к данным, Entity Framework, в сочетании с Visual Studio, обеспечивает широкие возможности работы с базами данных и может использоваться в любых приложениях, будь это веб-сайт, настольное приложение или веб-служба. Давайте кратко рассмотрим хронологию развития Entity Framework.
Впервые Entity Framework появился в 2007 году, а его первая поддержка была обеспечена в Visual Studio 2008, после чего этот API-интерфейс проделал долгий путь и оброс новыми возможностями:
В первой версии Entity Framework был достаточно ограничен и обеспечивал только базовую реализацию модели ORM на основе подхода Database-First (рассмотрим чуть позже). Версия 4.0 появилась вместе с .NET Framework 4 и Visual Studio 2010 и принесла нам новый подход — Model-First и поддержку POCO-объектов (POCO — Plain Old CLR Object). Вскоре после этого, команда разработчиков Entity Framework выпустила три версии (4.1 – 4.3), в которых поддерживался еще один подход к реализации ORM – Code-First.
Версия 5 Entity Framework вышла вместе с выпуском .NET 4.5 и Visual Studio 2012. Эта версия обеспечивает значительное повышение производительности наряду с поддержкой перечислений, табличных функций, пространственных типов Transact SQL, импорта хранимых процедур, и глубокой интеграцией с ASP.NET MVC.
Текущей версией Entity Framework является 6, в которой появилась поддержка асинхронных запросов и возможность работы с хранимыми процедурами через подход Code-First. Более подробный список изменений в версиях Entity Framework вы можете увидеть на сайте MSDN в статье Entity Framework Version History.
Структура Entity Framework
Теперь давайте кратко рассмотрим некоторые ключевые моменты Entity Framework.
Модель EDM
Entity Framework акцентирует свое внимание на моделировании, в котором вы увидите много знакомых вещей – здесь используются диаграммы ER (entity-relationship, “сущность-отношение”), подход с использованием логического и физического проектирования слоев и многое другое. Ядром Entity Framework является модель EDM (Entity Data Model), суть которой заключается в хранении сущностей (entity) в виде строго типизированных классов, а не в виде объектов схемы базы данных (показано на рисунке ниже). Модель EDM позволяет обеспечить связь между сущностными классами в коде и таблицами базы данных.
Обратите внимание, что на рисунке выше, таблицы базы данных непосредственно не отображаются на классы сущностей, вместо этого у разработчика есть возможность управлять процессом отображения и он может, например, разбить таблицу на несколько сущностей или наоборот, объединить несколько таблиц в одной сущности (хотя зачастую программисты не используют эту возможность и используют отображение “1 таблица – 1 сущность”).
Архитектура Entity Framework в абстрактном смысле основана на слоях (layers): рабочий, удаленный и связующий.
Классы с кодом сущностей содержатся в рабочем слое, в котором работают программисты. В зависимости от того, какой подход вы используете (Code-First или DB-First), рабочий слой может быть смоделирован либо с помощью графического дизайнера Visual Studio, либо с помощью кода. После этого у программистов появляется широкий инструментарий для работы с Entity Framework. Синтаксис рабочего слоя описывается с помощью языка Conceptual Schema Definition Language (CSDL).
Удаленный слой определяет таблицы, столбцы, строки, отношения между таблицами базы данных. Синтаксис удаленного слоя описывается с помощью языка Store Schema Definition Language (SSDL).
Связующий слой определяет соответствие между рабочим и удаленным слоями, он связывает свойства сущностного класса в рабочем слое со столбцами таблицы базы данных в удаленном слое. Управлять этим слоем (т.е деталями привязки) можно из окна Mapping Details находящегося в инструментах дизайнера Visual Studio или с помощью аннотаций Fluent API, если вы работаете с подходом Code-First. Язык Mapping Specification Language (MSL) определяет синтаксис связующего слоя.
Важно отметить, что языки CSDL, SSDL и MSL имеют синтаксис XML, но при этом используют разную семантику.
Файлы Entity Framework
Все файлы, используемые в Entity Framework основаны на синтаксисе XML. Использование XML делает файлы простыми и универсальными для других приложений. Также XML-файлы читабельны для человека – вы можете в любой момент открыть и просмотреть содержимое этих файлов. Тем не менее, каждый элемент Entity Framework использует различные файлы XML с различным расширением.
После того как вы создадите новое приложение, которое опирается на Entity Framework и добавите сущностные классы базы данных, вы сможете увидеть результирующие файлы в основной папке проекта (в следующей статье мы более подробно опишем генерацию сущностных классов). В среде Visual Studio 2012 вы найдете единственный файл Entity Data Model XML (.EDMX), хотя в более старых версиях Visual Studio возможно будет создано несколько файлов (один для каждой сущности).
Файл EDMX содержит в себе несколько секций, написанных на языках CSDL, SSDL и MSL, представляющих разные слои в архитектуре Entity Framework. Чтобы открыть исходный код этого файла в Visual Studio, щелкните по нему правой кнопкой мыши и выберите в контекстном меню Open With…, после чего в диалоговом окне выберите вариант XML Editor.
Раздел CSDL содержит XML-код, необходимый для построения рабочего слоя:
Обратите внимание, что в CSDL описываются сгенерированные сущности и связи между ними в разделе EntityContainer. В элементах EntityType описывается структура сущностей – имена столбцов и первичные ключи. Обратите внимание на атрибут Type, в котором указывается тип сущности – в данном случае используются .NET-совместимые типы, а не типы T-SQL.
Секция с кодом SSDL описывает структуру таблиц базы данных, их структуру, хранимые процедуры и т.д. Разделы EntityContainer и EntityType аналогичны секции CSDL, но записи опираются на типы данных T-SQL, а не .NET. В примере ниже показана часть секции с кодом SSDL:
Код MDL связывает сущности, указанные в разделах SSDL и CSDL, и определяет как будут отображаться данные из базы данных на классы .NET. В примере ниже показана часть секции с кодом MDL:
Подходы для работы с Entity Framework
В Entity Framework поддерживается три подхода к разработке:
Database-First
Подходит для проектировщиков баз данных — сначала вы создаете базу данных с помощью различных инструментов (например, SQL Server Management Studio), а затем генерируете EDMX-модель базы данных, которая предоставляет удобный графический интерфейс для взаимодействия с базой данных в виде диаграмм и объектную модель в виде классов C#. В данном случае вам нужно работать с SQL Server и хорошо знать синтаксис T-SQL, но при этом не нужно разбираться в C#.
Model-First
Подходит для архитекторов — сначала вы создаете графическую модель EDMX в Visual Studio (в фоновом режиме создаются классы C# модели), а затем генерируете на основе диаграммы EDMX базу данных. При данном подходе не нужно знать ни деталей T-SQL ни синтаксиса C#.
Code-First
Подходит для программистов — при данном подходе модель EDMX вообще не используется и вы вручную настраиваете классы C# объектной модели (данный подход поддерживает как генерацию сущностных классов из существующей базы данных, так и создание базы данных из созданной вручную модели объектов C#). Очевидно, что это подходит для программистов, хорошо знакомых с синтаксисом C#.
Entity Framework учебник
Начало работы с Entity Framework
Entity Framework (EF) — объектно-реляционный картограф (ORM), который позволяет разработчикам .NET работать с реляционными данными с использованием объектов, специфичных для домена. Это устраняет необходимость в большей части кода доступа к данным, который разработчикам обычно приходится писать.
Entity Framework позволяет создавать модель путем написания кода или использования полей и строк в EF Designer. Оба этих подхода могут использоваться для таргетинга на существующую базу данных или создания новой базы данных.
Entity Framework является основным ORM, который Microsoft предоставляет для .NET Framework и рекомендованной Microsoft технологии доступа к данным.
Версии
Версия | Дата выхода |
---|---|
1,0 | 2008-08-11 |
4,0 | 2010-04-12 |
4,1 | 2011-04-12 |
4.1 Обновление 1 | 2011-07-25 |
4.3.1 | 2012-02-29 |
5.0 | 2012-08-11 |
6,0 | 2013-10-17 |
6,1 | 2014-03-17 |
Core 1.0 | 2016-06-27 |
Использование Entity Framework из C # (сначала код)
Сначала код позволяет создавать ваши сущности (классы) без использования GUI-дизайнера или файла .edmx. Сначала он называется Code , потому что вы можете сначала создать свои модели, а структура Entity будет автоматически создавать базу данных в соответствии с сопоставлениями. Или вы также можете использовать этот подход с существующей базой данных, которая сначала называется кодом с существующей базой данных. Например, если вы хотите, чтобы таблица содержала список планет:
Теперь создайте свой контекст, который является мостом между вашими сущностями и базой данных. Дайте ему один или несколько DbSet<> :
Мы можем использовать это, выполнив следующие действия:
В этом примере мы создаем новую Planet с свойством Name со значением "Jupiter" и свойство AverageDistanceFromSun со значением 778.5
Затем мы можем добавить эту Planet в контекст с помощью DbSet Add() DbSet и зафиксировать наши изменения в базе данных с помощью метода SaveChanges() .
Или мы можем извлекать строки из базы данных:
Установка пакета Entity Framework NuGet
В своей Visual Studio откройте окно Solution Explorer, затем щелкните правой кнопкой мыши на своем проекте и выберите « Управление пакетами NuGet» в меню:
В открывшемся окне введите EntityFramework в поле поиска в правом верхнем углу.
Если вы используете Visual Studio 2015, вы увидите что-то вроде этого:
Затем нажмите «Установить».
Мы также можем установить инфраструктуру сущности с помощью консоли диспетчера пакетов. Для этого вам сначала нужно открыть его с помощью меню «Сервис» -> «Диспетчер пакетов NuGet» -> «Диспетчер пакетов», затем введите следующее:
Это установит Entity Framework и автоматически добавит ссылку на сборку в вашем проекте.
Что такое Entity Framework?
Написание и управление кодом ADO.Net для доступа к данным — утомительная и монотонная работа. Microsoft предоставила инфраструктуру O / RM под названием «Entity Framework» для автоматизации действий, связанных с базой данных для вашего приложения.
Структура Entity — это структура Object / Relational Mapping (O / RM). Это усовершенствование ADO.NET, которое дает разработчикам автоматизированный механизм для доступа и хранения данных в базе данных.
Что такое O / RM?
ORM — это инструмент для хранения данных из объектов домена в реляционную базу данных, такую как MS SQL Server, автоматическим способом без большого программирования. O / RM включает в себя три основные части:
- Объекты класса домена
- Объекты реляционной базы данных
- Отображение информации о том, как объекты домена сопоставляются с объектами реляционной базы данных ( ex tables, views и хранимые процедуры)
ORM позволяет нам сохранить наш дизайн базы данных отдельно от нашего класса класса. Это делает приложение удобным и расширяемым. Он также автоматизирует стандартную операцию CRUD (создание, чтение, обновление и удаление), так что разработчику не нужно писать его вручную.