Моделирование и сопоставление
В Entity Framework можно определить концептуальную модель, модель хранения и сопоставление между ними так, как это лучше всего соответствует вашему приложению. Инструменты для моделей данных сущностей в Visual Studio позволяют создать . Файл edmx из базы данных или графической модели, а затем обновляет этот файл при изменении базы данных или модели.
Начиная с версии 4.1 платформы Entity Framework модель можно также создавать программно с помощью шаблона разработки Code First. Шаблон разработки Code First имеет два различных сценария. В обоих случаях разработчик определяет модель, задавая в коде определения классов .NET Framework, а затем выборочно определяет дополнительные сопоставления или конфигурации с помощью заметок к данным или fluent API.
Дополнительные сведения см. в разделе Создание модели.
Можно также использовать генератор EDM, который входит в состав платформа .NET Framework. Программа EdmGen.exe формирует файлы языка CSDL, SSDL и MSL на основе существующего источника данных. Можно также вручную создать содержимое модели и сопоставления. Дополнительные сведения см. в разделе Генератор EDM (EdmGen.exe).
EDM (модель данных с использованием сущностей)
Модель EDM — это набор основных понятий, которые описывают структуру данных независимо от формы хранения. Модель EDM заимствует свойства модели «сущность-связь», описанной Питером Ченом в 1976 г., более того, она строится на модели «сущность-связь» и расширяет возможности ее традиционного использования.
Модель EDM решает проблемы, возникающие из необходимости хранить данные в различных формах. Например, предположим, есть фирма, которая хранит данные в реляционных базах данных, текстовых файлах, файлах XML, электронных таблицах и отчетах. Это является значительным препятствием для моделирования данных, проектирования приложений и доступа к данным. Во время проектирования приложения, ориентированного на работу с данными, сложность заключается в написании эффективного и поддерживаемого кода без ущерба для эффективности доступа к данным, хранения и масштабируемости. Если данные имеют реляционную структуру, доступ к данным, хранение и масштабируемость будут весьма эффективными, однако написание эффективного и поддерживаемого кода становится более сложным. Если данные имеют структуру объекта, компромиссы приобретают обратный характер: написание эффективного и поддерживаемого кода наносит ущерб эффективности доступа к данным, хранения и масштабируемости. Даже если для этих компромиссов будут найдены правильные решения, при перемещении данных из одной формы в другую возникают новые трудности. Модель EDM решает эти трудности путем описания структуры данных на основе сущностей и связей, которые являются независимыми от схем хранения. В результате форма хранения данных уже не имеет отношения к проектированию приложений и разработке. Поскольку сущности и связи описывают структуру данных так, как она используется в приложении (а не ее форму хранения), они могут эволюционировать по мере эволюции приложения.
conceptual model — это специфическое представление структуры данных в виде сущностей и связей, которое обычно определяется на доменном языке DSL, реализующем основные понятия модели EDM. Примером такого языка для конкретной предметной области является язык определения концептуальной схемы (CSDL). Сущности и связи, описанные в концептуальной модели, можно представить в виде абстракций объектов и ассоциаций в приложении. Это позволяет разработчикам сфокусировать внимание на концептуальной модели, не думая о схеме хранения, и писать эффективный и поддерживаемый код. Одновременно разработчики схем хранения могут сфокусировать внимание на эффективности доступа к данным, хранения и масштабируемости.
В этом разделе
В подразделах этого раздела описываются основные понятия модели EDM. Любой специфический язык домена (DSL), реализующий модель EDM, должен включать основные понятия, описанные в данном разделе. Обратите внимание, что ADO.NET Entity Framework использует CSDL для определения концептуальных моделей. Для получения дополнительной информации см. CSDL Specification.
Лекции / Глава 17. Entity Framework
С помощью специального класса PluralizationService Entity Framework проводит сопоставление между именами классов моделей и именами таблиц. При этом таблицы получают по умолчанию в качестве названия множественное число в соответствии с правилами английского языка, например, класс User — таблица Users, класс Person — таблица People (но не Persons!). Названия столбцов получают названия свойств модели. Если нас не устраивают названия таблиц и столбцов по умолчанию, то мы можем переопределить данный механизм с помощью Fluent API или аннотаций. §17.4 Автоматизация Code First Вручную создавать классы по уже готовой базе данных со всеми полями и связями между собой довольно утомительно, особенно если таблиц в БД очень много. В обновленных версиях Visual Studio 2019 мы можем автоматизировать этот процесс. Для этого добавим в проект новый элемент Модель ADO.NET Entity Data Model (EDM) : Рисунок 9 11
Нажмем OK и нам откроется мастер создания модели. Здесь нам надо выбрать пункт Code First из базы данных : Рисунок 10 Далее на следующем шаге настройки модели надо будет установить подключение к имеющейся базе данных. 12
Рисунок 11 После этого в окне мастера настройки модели появится выбранное подключение. И также здесь мы можем установить название подключения, которое будет использоваться в файле конфигурации App.config. Изменим его, например, на UserContext : Рисунок 12 13
Нажмем «Далее», и на следующем шаге нам будет предложено выбрать те таблицы из базы данных, по которым нам надо создать модели: Рисунок 13 И затем нажмем «Готово». После этого будут сгенерированы классы моделей. Например, в моем случае по единственной таблице в базе данных будет сгенерирован следующий класс: Листинг 17.4
| 1 | public partial class User |
| 2 | |
| 3 | public int Id |
| 4 | [StringLength(50)] |
| 5 | public string Name |
| 6 | public int ? Age |
| 7 | [StringLength(50)] |
| 8 | public string Log |
| 9 | [StringLength(50)] |
| 10 | public string Password |
| 11 | > |
| 12 | public partial class User |
| 13 | |
| 14 | public int Id |
| 15 | [StringLength(50)] |
| 16 | public string Name |
| 14 |
17 public int ? Age < get ; set ; >18 > И также надо отметить, что в файле App.config появилось определение подключения: < connectionStrings > < add name = " UserContext " connectionString = " data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=|DataDirectory|\userdb. mdf;integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework " providerName = " System.Data.SqlClient " /> connectionStrings > Для полноценной работы добавим в проект класс контекста данных UserContext : Листинг 17.5
| 1 | public class UserContext : DbContext |
| 2 | |
| 3 | public UserContext() : base(«UserContext») |
| 4 | |
| 5 | public DbSet Users |
| 6 | > |
И теперь мы можем взаимодействовать с базой данных. Для этого разработаем графический пользовательский интерфейс, как на рисунке 8, и добавим в класс формы те же самые методы, которые были созданы для получения данных из БД (листинг 17.3). §17.5 Database First Database First был первым подходом, который появился в Entity Framework. Данный подход во многом похож на Model First и подходит для тех случаев, когда разработчик уже имеет готовую базу данных. Чтобы Entity Framework мог получить доступ к базе данных, в системе должен быть установлен соответствующий провайдер . Так, Visual Studio уже поддерживает соответствующую инфраструктуру для СУБД MS SQL Server. Для остальных СУБД, например, MySQL, Oracle и других надо устанавливать соответствующие провайдеры 1 . 1 Список провайдеров для наиболее распространенных СУБД можно найти на странице https://docs.microsoft.com/ru-ru/dotnet/framework/data/adonet/ado-net-overview?redirectedfrom=MSDN 15
Итак, создадим новый проект по типу Приложение Windows Forms . После создания нового проекта, чтобы задействовать базу данных, нам надо ее иметь. Создадим новую базу данных или возьмем уже имеющуюся. В Visual Studio в окне Обозреватель решений нажмем на проект правой кнопкой мыши и выберем Добавить → Создать элемент . Далее в появившемся окне добавления нового элемента выберем Модель ADO.NET EDM . Дадим новому компоненту какое-либо название, например, User: Рисунок 14 После этого нам откроется окно мастера создания модели. В нем нам надо выбрать опцию Конструктор EF из базы данных . 16
Рисунок 15 Затем откроется окно следующего шага по созданию модели, на котором надо будет установить подключение к базе данных: Рисунок 16 В выпадающем списке выберем одно из доступных подключений. Если в списке нет предпочтительных подключений, то можно нажать на кнопку Создать соединение… и установить новое подключение. 17
Также внизу указывается название контекста данных, который будет использоваться для доступа к данным. По умолчанию у меня контекст имеет название userdbEntities . Можно изменить, а можно и оставить. Выбрав подключение, переходим к следующему шагу. Если у нас Visual Studio 2019 без пакетов обновления, то будет предложено также выбрать версию Entity Framework. Выберем шестую версию: Рисунок 17 Далее Visual Studio извлекает всю информацию о базе данных: 18
Рисунок 18 Раскроем узел Таблицы . Он отображает все таблицы, имеющиеся в базе данных. В моем случае имеется только одна таблица Users. Отметим все подузлы в ветке Таблицы . В поле Пространство имен модели установим предпочтительное имя модели и нажмем Готово . После этого Entity Framework сгенерирует модель по базе данных и добавит ее в проект. Visual Studio отобразит нам схему модели. В моем случае в базе данных есть только одна таблица Users, поэтому на схеме отображается только одна сущность User: Рисунок 19 19
После выделения сущности в правом нижнем углу Visual Studio мы увидим свойства для этой сущности: Рисунок 20 Свойство Name в окне свойств указывает на класс, которым будет представлена данная сущность (то есть классом User ). А свойство Имя набора сущностей указывает на имя набора объектов (то есть свойство DbSet контекста данных) — в данном случае Users . И теперь мы можем взаимодействовать с базой данных. Для этого можно разработать такой же графический пользовательский интерфейс, как на рисунке 8, и добавить в класс формы те же самые методы, которые были созданы для получения данных из БД (листинг 17.3). Единственное исключение – это класс контекста данных. При реализации подхода Database First будем использовать класс userdbEntities , определенный в мастере моделей EDM (Рисунок 16). §17.6 Model First Model First представляет еще один подход к работе с Entity Framework. Суть данного подхода состоит в том, что сначала делается модель, а потом по ней создается база данных. Итак, создадим новый проект по типу Приложение Windows Forms . И затем добавим в проект новый элемент. Нажмем правой кнопкой мыши на проект в окне Обозреватель решений и в появившемся списке выберем Добавить → Создать элемент . И затем в окне добавления нового элемента выберем Модель ADO.NET EDM : 20
Модель ado net edm как добавить в vs
Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core
Последнее обновление: 31.10.2015
Model First представляет еще один подход к работе с Entity Framework. Суть данного подхода состоит в том, что сначала делается модель, а потом по ней создается база данных.
Итак, создадим новый проект по типу Console Application. И затем добавим в проект новый элемент. Нажмем правой кнопкой мыши на проект в окне Solution Explorer и в появившемся списке выберем Add -> New Item . И затем в окне добавления нового элемента выберем ADO.NET Entity Data Model :
Поскольку модель будет описывать человека, то назовем ее User. Нажмем OK и нам откроется мастер создания модели. Если у нас Visual Studio с пакетами обновления SP2, SP3, то мастер создания модели выглядит следующим образом:

Окно нам предлагает четыре варианта создания модели, из которых нам надо выбрать Empty EF Designer Model .
Нажмем кнопку Finish, и перед нами откроется пустое окно создания модели.

Перетащим на это поле с панели Toolbox (Панель Инструментов) в левой части элемент Entity. Теперь у нас на поле создания модели имеется небольшая схема будущей модели, в которой сейчас по умолчанию указано лишь одно поле — Id. Во-первых, переименуем сущность. По умолчанию она называется Entity1. Выделим схему и перейдем к окну свойств в правом нижнем углу:

Здесь изменим значение свойства Name на User. Это у нас будет имя сущности. И также изменим значение свойства Entity Set Name на Users. Это у нас будет название набора объектов User.
Далее создадим несколько свойств. Сущность у нас будет простая и будет содержать всего два свойства для имени и возраста. Итак, выделим схему сущности и нажмем на правую кнопку мыши. В выпадающем списке выберем Add New -> Scalar Property . После этого будет добавлено новое свойство. Scalar Property подразумевают свойства на основе простейших типов int, float, string и т.д. Добавим два свойства — Name и Age. По умолчанию все добавляемые свойства имеют тип string. Однако мы можем изменить тип в окне свойств.
Таким образом, у нас должна получиться следующая схема сущности:

После создания диаграммы модели перестроим проект с помощью опции Rebuild.
Теперь по модели мы можем сгенерировать код и базу данных. Вначале сгенерируем код модели. Для этого нажмем на диаграмму модели правой кнопкой мыши и выберем пункт Add Code Generation Item :

Далее нам будет предложено выбрать версию EF. Выберем шестую версию:

После этого в структуре проекта мы можем увидеть узел User.tt, который в качестве подузла будет содержать класс модели в файле User.cs:

Также здесь мы можем найти файл контекста данных User.Context.cs, который выглядит в моем случае следующим образом:
namespace ModelFirst < using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; public partial class UserContainer : DbContext < public UserContainer() : base("name=UserContainer") < >protected override void OnModelCreating(DbModelBuilder modelBuilder) < throw new UnintentionalCodeFirstException(); >public virtual DbSet Users < get; set; >> >
Теперь сгенерируем базу данных по нашей модели. Итак, нажмем на диаграмму модели правой кнопкой мыши и в выпадающем списке выберем Generate Database from Model (Сгенерировать базу данных по модели). Перед нами откроется мастер создания подключения.

Нажмем на кнопку New Connection (Новое подключение). Далее открывается новое окно, где будет предложено настроить подключение и создать базу данных:

Здесь нам надо ввести имя сервера. А также название бд. В качестве имени базы данных введем usersdb, а в качестве сервера: (localdb)\v11.0 . Нажмем OK и затем Visual Studio установит в качестве подключения модели только что созданную базу данных:

После этого будет сгенерирован скрипт базы данных:

Нажмем Finish (Готово). У нас автоматически откроется в Visual Studio файл скрипта User.edmx.sql. И в завершении нам надо будет запустить этот скрипт. Для этого нажмем в верхнем левом углу на зеленую кнопку Execute (Выполнить):

После этого в нижнем окне Visual Studio нам сообщит об успешном (или неуспешном) создании базы данных. Если мы откроем окно Database Explorer (его можно открыть, выбрав в меню View->Other Windows), то мы увидим нашу базу данных. А раскрыв узел, также увидим, что она содержит всю ту схему, которую мы определили в модели:

Это все была работа по созданию модели и базы данных. И в конце определим минимальный код для работы с базой данных:
static void Main(string[] args) < using(UserContainer db = new UserContainer()) < // добавление элементов db.Users.Add(new User ); db.Users.Add(new User ); db.SaveChanges(); // получение элементов var users = db.Users; foreach (User u in users) Console.WriteLine(". - ", u.Id, u.Name, u.Age); > Console.Read(); >
