Лекции / Глава 17.3 Entity Framework
.pdfРисунок 17.9 – Мастер создания моделей
Окно нам предлагает четыре варианта создания модели, из которых нам надо выбрать Пустая модель конструктор в EF.
Нажмем кнопку Готово, и перед нами откроется пустое окно создания модели.
Перетащим на это поле с панели Панель Инструментов в левой части элемент Сущность. Теперь у нас на поле создания модели имеется небольшая схема будущей модели, в которой сейчас по умолчанию указано лишь одно поле - Id. Во-первых, переименуем сущность. По умолчанию она называется
Entity1.
Рисунок 17.10 – Схема модели и панель элементов
Выделим схему и перейдем к окну свойств в правом нижнем углу:
Рисунок 17.11 – Свойства сущности
Здесь изменим значение свойства Имя на User. Это у нас будет имя сущности. И также изменим значение свойства Имя набора сущностей на
Users. Это у нас будет название набора объектов User.
Далее создадим несколько свойств. Сущность у нас будет простая и будет содержать всего два свойства для логина и пароля пользователя. Итак,
выделим схему сущности и нажмем на правую кнопку мыши. В выпадающем списке выберем Добавить новый → Скалярное свойство. После этого будет добавлено новое свойство. Скалярное свойство подразумевают свойства на основе простейших типов int, float, string и т.д. Добавим три свойства –
Login, Password и Role. По умолчанию все добавляемые свойства имеют тип string. Однако мы можем изменить тип в окне свойств.
Таким образом, у нас должна получиться следующая схема сущности:
Рисунок 17.12 – Схема сущности «Пользователь»
Составим соответствующие схемы для остальных трех сущностей:
студента преподавателя и дипломной работы.
Рисунок 17.13 – Схемы сущностей «Преподаватель», «Студент» и «Дипломная работа»
Далее добавим связи между сущностями. Выберем из панели элементов объект «Ассоциация» и выберем в поле две сущности, между которыми будет установлена связь.
Рисунок 14 – Объект «Ассоциация» для установления связей»
Например, установим для начала связь между сущностями User и Student. Изменим ее вид, нажав на линию связи правой кнопкой мыши и выбрав пункт Свойства.
Рисунок 17.15 – Свойства связи
Для связи между сущностями User и Student установим вид связи «ноль-
или-один-к-одному», так как необходимо допустить возможность отсутствия
(равенство NULL) привязанной сущности Student при создании User и
наоборот. Для изменения вида связи необходимо изменить свойство
Кратность элемента на 0 (ноль из Student/ User) в обоих случаях.
После создания связи также будет автоматически сгенерировано навигационное свойство для обоих сущностей, которые будут играть роль внешний ключей в структуре базы данных.
Общий вид модели данных после установления всех связей между сущностями представлен на рисунке 17.117.
Рисунок 17.16 – Общий вид модели данных
Теперь по модели мы можем сгенерировать код и базу данных. Вначале сгенерируем код модели. Для этого нажмем на диаграмму модели правой кнопкой мыши и выберем пункт Добавить элемент создания кода:
Далее нам будет предложено выбрать версию EF. Выберем шестую версию:
Рисунок 17.17 – Добавление элемента создания кода
После этого в структуре проекта мы можем увидеть узел EntityModel.tt,
который в качестве подузлов будет содержать сгенерированные классы модели в файлах User.cs, Professor.cs, Thesis.cs и Student.cs:
Рисунок 17.18 – Узел с классами модели
Также здесь мы можем найти файл контекста данных
EntityModel.Context.cs, который выглядит в моем случае следующим образом:
|
Листинг 17.1 – Сгенерированный контекст данных |
|
|
|
|
1 |
using System; |
|
2 |
using System.Data.Entity; |
|
3 |
using System.Data.Entity.Infrastructure; |
|
4 |
public partial class EntityModelContainer : DbContext |
|
5 |
{ |
|
6 |
public EntityModelContainer() |
|
7 |
: base("name=EntityModelContainer"){} |
|
8 |
protected override void OnModelCreating(DbModelBuilder |
|
modelBuilder) |
||
|
||
9 |
{ |
|
10 |
throw new UnintentionalCodeFirstException(); |
|
11 |
} |
|
12 |
public virtual DbSet<User> UserSet { get; set; } |
|
13 |
public virtual DbSet<Student> StudentSet { get; set; } |
|
14 |
public virtual DbSet<Professor> ProfessorSet { get; |
|
set; } |
||
15 |
public virtual DbSet<Thesis> ThesisSet { get; set; } |
|
16 |
} |
Теперь сгенерируем базу данных по нашей модели. Итак, нажмем на диаграмму модели правой кнопкой мыши и в выпадающем списке выберем
Сформировать базу данных на основе модели. Перед нами откроется мастер создания подключения.
Рисунок 17.19 – Мастер создания базы данных
Нажмем на кнопку Создать подключение. Далее открывается новое окно, где будет предложено настроить подключение и создать базу данных:
Рисунок 17.20 – Создание базы данных
Здесь нам надо указать путь, куда будет сохраняться создаваемая база данных, и указать ее имя. В качестве имени базы данных введем LR6DB.
Нажмем OK и затем Visual Studio установит в качестве подключения модели только что созданную базу данных. После этого будет сгенерирован скрипт базы данных1:
Рисунок 17.21 – DDL-скрипт для создания элементов базы данных
1 Если при генерации скрипта будет выводится ошибка, перезапустите Visual Studio
Нажмем Готово. У нас автоматически откроется в Visual Studio файл скрипта EntityModel.edmx.sql. И в завершении нам надо будет запустить этот скрипт. Для этого нажмем в верхнем левом углу на зеленую кнопку
Выполнить:
Рисунок 17.22 –Запуск скрипта
После этого в нижнем окне Visual Studio нам сообщит об успешном (или неуспешном) создании базы данных. Если мы откроем окно Обозреватель серверов (его можно открыть, выбрав в меню Вид → Другие окна), то мы увидим нашу базу данных. А раскрыв узел, также увидим, что она содержит всю ту схему, которую мы определили в модели:
Рисунок 17.23 – Обзор созданной базы данных
§17.16 Создание интерфейса приложения
§17.117.1 TableLayoutPanel
Для организации элементов управления в связанные группы существуют специальные элементы - контейнеры. Например, Panel, FlowLayoutPanel, SplitContainer, GroupBox. Ту же форму также можно отнести к контейнерам.
Использование контейнеров облегчает управление элементами, а также придает форме определенный визуальный стиль.
Все контейнеры имеют свойство Controls, которое содержит все элементы данного контейнера. Когда мы переносим какой-нибудь элемент с панели инструментов на контейнер, например, кнопку, она автоматически добавляется в данную коллекцию данного контейнера. Либо мы также можем добавить элемент управления динамически с помощью кода в эту же коллекцию.
Элемент TableLayoutPanel также переопределяет панель и располагает дочерние элементы управления в виде таблицы, где для каждого элемента имеется своя ячейка. Если нам хочется поместить в ячейку более одного элемента, то в эту ячейку добавляется другой компонент TableLayoutPanel, в
который затем вкладываются другие элементы.
Чтобы установить нужное число строки столбцов таблицы, мы можем использовать свойства Rows и Columns соответственно. Выбрав один из этих пунктов в окне Свойства, нам отобразится следующее окно для настройки столбцов и строк: