Модель EDM

Понимая предназначение платформы ADO.NET Entity Framewrok, а также имея общее представление о ее работе, можно приступать к рассмотрению первого примера. Чтобы пока не усложнять картину, построим модель EDM, которая обеспечит доступ только к таблице Inventory базы данных AutoLot, созданной ранее — ADO_NET/base/level3/3_2.php. Разобравшись с основами, мы затем построим новую модель EDM, которая будет рассчитана на всю базу данных AutoLot.
Генерация файла *.edmx
Начнем с создания консольного приложения. Когда планируется использование Entity Framework, первый шаг состоит в генерации необходимой концептуальной, логической и физической модели данных, определенной в файле *.edmx. Один из способов предусматривает применение для этого утилиты командной строки EdmGen.exe из комплекта .NET 4.0 SDK. Откройте окно командной строки Visual Studio 2010 и введите следующую команду:
EdmGen.exe -?
На консоль выводится список опций, которые можно указывать утилите для генерации необходимых файлов, основываясь на существующей базе данных; кроме того, доступны опции для генерации совершенно новой базы данных на основе имеющихся сущностных файлов. Ниже описаны некоторые общие опции EdmGen.exe:
/mode:FullGeneration
Генерировать файлы *.ssdl, *.msl, *.csdl и клиентские сущности из указанной базы данных
/project:
Базовое имя, которое должно использоваться для сгенерированного кода и файлов. Обычно это имя базы данных, из которой извлекается информация (допускается сокращенная форма — /р:)
/connectionstring:
Строка соединения, используемая для взаимодействия с базой данных (допускается сокращенная форма — /с:)
/language:
Позволяет указать, какой синтаксис должен использоваться для сгенерированного кода — C# или VB
/pluralize
Позволяет автоматически выбирать множественное или единственное число для имени набора сущностей, имени типа сущности и имени навигационного свойства, согласно правилам английского языка
Как и платформа .NET 4.0 в целом, программная модель EF поддерживает программирование в стиле сначала домен, что позволяет создавать свойства (с применением типичных объектно-ориентированных приемов) и использовать их для генерации новой базы данных. В этом вводном обзоре ADO.NET EF ни подход «сначала модель», ни генерация сущностной модели клиентской стороны с помощью утилиты EdmGen.exe применяться не будут. Вместо этого будут использоваться визуальные конструкторы EDM из среды Visual Studio 2010.
Выберите пункт меню Project —> Add New Item (Проект —> Добавить новый элемент) и вставьте новый элемент ADO.NET Entity Data Model по имени InventoryEDM.edmx:

Щелчок на кнопке Add (Добавить) приводит к запуску мастера создания модели сущностных данных (Entity Data Model Wizard). На первом шаге мастер позволяет выбрать, нужно генерировать EDM из существующей базы данных либо определить пустую модель (для разработки в стиле «сначала модель»). Выберите опцию Generate from database (Генерировать из базы данных) и щелкните на кнопке Next (Далее).
На втором шаге мастера выбирается база данных. Если соединение с базой данных внутри проводника сервера Visual Studio 2010 уже существует, оно будет присутствовать в раскрывающемся списке. Если же нет, щелкните на кнопке New Connection (Создать соединение). В любом случае выберите базу данных AutoLot и отметьте флажок Save entity connection settings in App.config as (Сохранить настройки соединения в файле App.config как):

Прежде чем щелкать на кнопке Next, взгляните на формат строки соединения:
metadata=res://*/InventoryEDM.csdl|res://*/InventoryEDM.ssdl|res://*/InventoryEDM.msl; provider=System.Data.SqlClient;provider connection string="Data Source=MICROSOF-1EA29E\SQLEXPRESS;Initial Catalog=AutoLot; Integrated Security=True;Pooling=False"
Основной интерес в ней представляет флаг metadata, который используется для указания имен встроенных данных XML-ресурсов концептуального, физического и файла отображений (вспомните, что во время компиляции файл *.edmx будет разделен на отдельные файлы, и данные этих файлов примут вид двоичных ресурсов, встраиваемых в сборку).
На последнем шаге мастера можно выбрать элементы из базы данных, для которой необходимо сгенерировать модель EDM. В рассматриваемом примере ограничимся только таблицей Inventory. Щелкните на кнопке Finish для генерации модели EDM.
Изменение формы сущностных данных
После завершения работы с мастером откроется визуальный конструктор EDM в IDE-среде с одной сущностью по имени Inventory. Просмотреть композицию любой сущности в визуальном конструкторе можно в окне Model Browser (Браузер моделей), которое открывается через пункт меню View —> Other Windows (Вид —> Другие окна).
Теперь взгляните на формат концептуальной модели для таблицы базы данных Inventory, представленный в папке Entity Types (Типы сущности). В узле хранилища, имя которого совпадает с именем базы данных (AutoLotModel.Store), находится физическая модель базы данных:

По умолчанию имена сущностей будут основаны на именах исходных объектов баз данных; однако, вспомните, что имена сущностей в концептуальной модели могут быть любыми. Чтобы изменить имя сущности либо имена свойств сущности, необходимо выбрать нужный элемент в визуальном конструкторе и установить соответствующим образом свойство Name в окне свойств (Properties). Переименуйте сущность Inventory в Car и свойство PetName в CarNickname:

Теперь выберите сущность Car в визуальном конструкторе и снова загляните в окно Properties. Вы должны увидеть поле Entity Set Name (Имя набора сущностей), также переименованное из Inventories в Cars. Значение Entity Set Name важно, потому что оно соответствует имени свойства в классе контекста данных, который используется для модификации базы данных. Вспомните, что это свойство инкапсулирует переменную-член ObjectSet класса-наследника ObjectContext.
Прежде чем двигаться дальше, скомпилируйте приложение; это приведет к обновлению кодовой базы и генерации файлов *.csdl, *.msl и *.ssdl на основе данных файла *.edmx.
Просмотр отображений
Имея данные в измененной форме, можно просматривать отображения между концептуальным уровнем и физическим уровнем в окне Mapping Details (Сведения об отображениях), которое открывается через пункт меню View —> Other Windows —> Mapping Details. Взгляните на рисунок ниже и обратите внимание, что узлы в левой части дерева представляют имена данных из физического уровня, в то время как узлы справа представляют имена концептуальной модели:

Просмотр данных сгенерированного файла *.edmx
Теперь давайте посмотрим, что именно мастер EDM Wizard сгенерировал. Щелкните правой кнопкой мыши на файле InventoryEDM.edmx в проводнике решения и выберите в контекстном меню пункт Open With. (Открыть с помощью). В открывшемся диалоговом окне выберите опцию XML Editor (Редактор XML). Это позволит просмотреть XML-данные, лежащие в основе представления в визуальном конструкторе EDM. Структура этого XML-документа разделена на четыре части: все они находятся в корневом элементе .
Подэлемент определяет XML-данные для концептуальной, физической и модели уровня отображения. Ниже показано определение физической таблицы базы данных Inventory:
Обратите внимание, что узел определяет имя поставщика данных ADO.NET, который использует эту информацию при взаимодействии с базой данных (System.Data.SqlClient). Узлами помечается имя физической таблицы базы данных, а также каждый столбец в таблице.
Следующая важная часть файла *.edmx — элемент . который определяет измененные сущности клиентской стороны. Как видно, сущность Cars определяет свойство CarNickname, которое изменяется в визуальном конструкторе:
Это перемещает на уровень отображения, который окно Mapping Details и исполняющая среда EF используют для подключения имен в концептуальной модели к физической модели:
Последней частью файла *.edmx является элемент . который исполняющей средой EF не используется. Он содержит инструкции, используемые Visual Studio для отображения сущностей на поверхности визуального конструктора.
Удостоверьтесь, что проект скомпилирован, по крайней мере, однажды, и щелкните на кнопке Show All Files (Показать все файлы) в проводнике решений. Затем зайдите в папку obj\Debug, а после этого — в edmxResourcesToEmbed. Здесь находятся три XML-файла, основанные на содержимом файла *.edmx:

Данные в этих файлах будут встроены в сборку как двоичные ресурсы. Таким образом, приложение .NET обладает всей информацией, необходимой для понимания концептуального, физического и уровня отображения модели EDM.
ADO.NET edm отсутствует в Visual Studio
Вы можете столкнуться с тем, что при попытке добавить к своему проекту в Visual Studio модель ADO.NET EDM, вы ее не найдете в списке доступных элементов. Вы можете попробовать произвести действия указанные ниже, чтобы решить данную проблему.
Отслеживать
задан 15 янв 2020 в 13:26
Алексей Федотов Алексей Федотов
714 6 6 серебряных знаков 21 21 бронзовый знак
Отредактируйте вопрос как вопрос
24 дек 2020 в 2:06
1 ответ 1
Сортировка: Сброс на вариант по умолчанию

Во-первых, ADO.NET EDM доступна не для всех проектов в VS (во всяком случае, сразу). Обратите внимание, какой проект вы создаете. Например:
Оба приложения — консольные. Однако только в проект слева можно добавить ADO. Если вы хотите сделать консольное приложение, то выбирайте простое консольное приложение для командной строки.
Если указанное действие не помогло, убедитесь, что у Вас установлен Entity Framework. Для этого откройте инсталлер Visual Studio (пуск -> в строку поиска «Visual studio installer»), нажмите «Дополнительно», затем «Изменить». Во вкладке «Отдельные компоненты» проверьте, установлен ли пакет/библиотека «Инструменты для Entity Framework 6». Если его нет — установите.
Не факт, что данные рекомендации помогут именно Вам, но наверняка приблизят Вас к цели.
Отслеживать
ответ дан 15 янв 2020 в 13:26
Алексей Федотов Алексей Федотов
714 6 6 серебряных знаков 21 21 бронзовый знак
А зачем вам EDM в новом проекте в 2020?
24 дек 2020 в 2:08
- c#
- ado.net
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.17.3574
Лекции / Глава 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 |
| 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
EDM (модель данных с использованием сущностей)
Модель EDM — это набор основных понятий, которые описывают структуру данных независимо от формы хранения. Модель EDM заимствует свойства модели «сущность-связь», описанной Питером Ченом в 1976 г., более того, она строится на модели «сущность-связь» и расширяет возможности ее традиционного использования.
Модель EDM решает проблемы, возникающие из необходимости хранить данные в различных формах. Например, предположим, есть фирма, которая хранит данные в реляционных базах данных, текстовых файлах, файлах XML, электронных таблицах и отчетах. Это является значительным препятствием для моделирования данных, проектирования приложений и доступа к данным. Во время проектирования приложения, ориентированного на работу с данными, сложность заключается в написании эффективного и поддерживаемого кода без ущерба для эффективности доступа к данным, хранения и масштабируемости. Если данные имеют реляционную структуру, доступ к данным, хранение и масштабируемость будут весьма эффективными, однако написание эффективного и поддерживаемого кода становится более сложным. Если данные имеют структуру объекта, компромиссы приобретают обратный характер: написание эффективного и поддерживаемого кода наносит ущерб эффективности доступа к данным, хранения и масштабируемости. Даже если для этих компромиссов будут найдены правильные решения, при перемещении данных из одной формы в другую возникают новые трудности. Модель EDM решает эти трудности путем описания структуры данных на основе сущностей и связей, которые являются независимыми от схем хранения. В результате форма хранения данных уже не имеет отношения к проектированию приложений и разработке. Поскольку сущности и связи описывают структуру данных так, как она используется в приложении (а не ее форму хранения), они могут эволюционировать по мере эволюции приложения.
conceptual model — это специфическое представление структуры данных в виде сущностей и связей, которое обычно определяется на доменном языке DSL, реализующем основные понятия модели EDM. Примером такого языка для конкретной предметной области является язык определения концептуальной схемы (CSDL). Сущности и связи, описанные в концептуальной модели, можно представить в виде абстракций объектов и ассоциаций в приложении. Это позволяет разработчикам сфокусировать внимание на концептуальной модели, не думая о схеме хранения, и писать эффективный и поддерживаемый код. Одновременно разработчики схем хранения могут сфокусировать внимание на эффективности доступа к данным, хранения и масштабируемости.
В этом разделе
В подразделах этого раздела описываются основные понятия модели EDM. Любой специфический язык домена (DSL), реализующий модель EDM, должен включать основные понятия, описанные в данном разделе. Обратите внимание, что ADO.NET Entity Framework использует CSDL для определения концептуальных моделей. Для получения дополнительной информации см. CSDL Specification.