Модель 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.
Лекции / Глава 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
dotConnect for Oracle
dotConnect for Oracle fully supports ADO.NET Entity Framework and can be used with standard Visual Studio Entity Data Model Wizard. The wizard, however, is tuned for SQL Server and exposes some problems when used against other data sources. This topic provides information on overcoming the issues of Entity Data Model Wizard.
To invoke the wizard, add new item to the project and select ADO.NET Entity Data Model. When supplied with valid connection parameters, the wizard shows a tree of objects that you can include in the model. There are three types of objects: tables, views, and stored procedures. The objects are grouped by schema name and sorted by object name.
You may encounter the following problems during the process of creating the model with Entity Data Model Wizard:
- Some database objects are not available in the tree.
- Some database objects are not included in the model though you have selected them.
- Tables or views have some columns missing.
- The wizard or EDM Designer work very slowly.
Database Objects Not Available in the Tree
The wizard includes all objects that the database user has access to. The visibility scope is determined by SELECT and EXECUTE grants, system privileges SELECT ANY TABLE and EXECUTE ANY PROCEDURE for both user and his roles. If you have any objects missing, make sure you are granted proper privileges.
Database Objects Are Not Included in the Model
ADO.NET Entity Framework can’t work with user-defined types and PL/SQL types that cannot be used in tables. Therefore, database objects that can be included in the model are subject to the following restrictions:
- Object tables must be based upon primitive types only.
- Stored procedures must have only parameters of supported types. If any parameter has unsupported type, the stored procedure is excluded from the model.
- Tables and views must have inferrable entity key.
Entity Framework requires every entity to have at least one column in the entity key. Usually entity key is inferred basing on the table’s primary key. If a table has no primary key, the entity key includes all NOT NULL columns. If a table has neither primary key nor NOT NULL columns, it is excluded from the model. The same applies to views: if a view has no NOT NULL columns, it is excluded from the model.
Entity Framework also exposes the following requirements to primary keys: it should be constrained NOT NULL and should not contain binary columns. If a primary key fails in these conditions, the entity is excluded from the model.
Tables Or Views Have Some Columns Missing
Columns of unsupported types are not included in the model. The tables and views that contain such columns are included, but without corresponding property.
After the generation of the model you can inspect the list of excluded objects in Visual Studio Error List window.
The Wizard Or EDM Designer Work Very Slowly
The way Microsoft EDM Wizard retrieves metadata from data source is not the best way for Oracle. The wizard’s performance significantly decreases when there are many database objects available. EDM Designer can be extremely slow for models with more than 100 entities.
If you experience performance problems, you can try the following workarounds:
- Do not connect as DBA.
- For the current user or role remove the privileges SELECT ANY TABLE and EXECUTE ANY PROCEDURE. Also you can remove grants SELECT and EXECUTE for particular objects.
- Create a new user with access only to objects that are intended for the model.
- Move the database schema to a clean installation of Oracle server and generate the model with that server.
- Decrease the amount of model entities.
We use cookies to provide you with a better experience on the Devart website. You can read more about our use of cookies in our Cookies Policy.
Click OK to continue browsing the Devart site. Be aware you can disable cookies at any time.
ADO.NET edm отсутствует в Visual Studio
Вы можете столкнуться с тем, что при попытке добавить к своему проекту в Visual Studio модель ADO.NET EDM, вы ее не найдете в списке доступных элементов. Вы можете попробовать произвести действия указанные ниже, чтобы решить данную проблему.
Отслеживать
задан 15 янв 2020 в 13:26
Алексей Федотов Алексей Федотов
704 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». Если его нет — установите.
Не факт, что данные рекомендации помогут именно Вам, но наверняка приблизят Вас к цели.