Добавил:
Преподаватель Колледжа информационных технологий Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / Глава 17. Entity Framework

.pdf
Скачиваний:
66
Добавлен:
08.05.2022
Размер:
1.63 Mб
Скачать

ГЛАВА 17. ENTITY FRAMEWORK

 

Оглавление

 

§17.1 Введение в Entity Framework .......................................................................

1

§17.2 Code First к существующей базе данных ....................................................

3

§17.3 Соглашения по наименованию в Code First ...............................................

9

§17.4 Автоматизация Code First...........................................................................

11

§17.5 Database First ................................................................................................

15

§17.6 Model First ....................................................................................................

20

§17.7 Основные операции с данными .................................................................

27

§17.8 Навигационные свойства и загрузка данных ...........................................

33

§17.9 Связь один к одному ...................................................................................

39

§17.10 Связь один ко многим...............................................................................

51

§17.1 Введение в 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 стал рекомендуемой технологией для доступа к данным, а в сам

1

фреймворк были введены новые возможности взаимодействия с БД - подходы

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 состоит из трех уровней:

1.концептуального,

2.уровень хранилища,

3.уровень сопоставления (маппинга).

2

На концептуальном уровне происходит определение классов сущностей, используемых в приложении.

Уровень хранилища определяет таблицы, столбцы, отношения между таблицами и типы данных, с которыми сопоставляется используемая база данных.

Уровень сопоставления (маппинга) служит посредником между предыдущими двумя, определяя сопоставление между свойствами класса сущности и столбцами таблиц.

Таким образом, мы можем через классы, определенные в приложении,

взаимодействовать с таблицами из базы данных.

Entity Framework предполагает три возможных способа взаимодействия

сбазой данных:

Database First: Entity Framework создает набор классов, которые отражают модель конкретной базы данных.

Model First: сначала разработчик создает модель базы данных, по которой затем Entity Framework создает реальную базу данных на сервере.

Code First: разработчик создает класс модели данных, которые будут храниться в БД, а затем Entity Framework по этой модели генерирует базу данных и ее таблицы.

§17.2 Code First к существующей базе данных

Вполне часто распространена ситуация, когда имеется объектная модель данных, заданная с помощью иерархии классов. Для создания базы данных из созданной вручную модели объектов C# или генерации сущностных классов из существующей базы данных поможет подход Code First. Посмотрим на примере.

Вначале создадим новый проект. Затем создадим тестовую базу данных.

В Visual Studio выберем в меню пункт Вид Обозреватель объектов SQL Server. В открывшемся окне обозревателя объектов SQL Server создадим новую базу данных. Для этого раскроем узел сервера, нажмем на узел Базы

3

данных правой кнопкой мыши и в появившемся контекстном меню выберем

Добавить новую базу данных.

Рисунок 1 – Добавление базы данных

Далее отобразится окно, в котором в качестве имени базы данных введем userdb:

Рисунок 2 – Окно создания базы данных

После создания базы данных добавим в нее таблицу. Нажмем правой кнопкой мыши на узел «Таблицы» и в появившемся контекстном меню выберем «Добавить новую таблицу».

Рисунок 3 – Добавление таблицы в базу данных

Затем в центральном поле в режиме дизайнера создадим следующее определение таблицы:

4

Рисунок 4 – Дизайнер таблицы

В поле T-SQL (или графически) определим структуру и имя таблицы,

типы столбцов и после этого нажмем в верхнем левом углу на кнопку

«Обновить».

В новом окне нам будет выдана некоторая информация об изменениях,

производимых в базе данных:

Рисунок 5

Нажмем на кнопку «Обновить базу данных». И после этого будет создана таблица Users.

5

Мы можем добавить некоторые данные в таблицу. Для этого нажмем на таблицу в окне «Обозреватель объектов SQL Server» правой кнопкой мыши и выберем пункт «Просмотр данных».

Рисунок 6

У нас откроется форма для работы с данными, в которую можно добавить пару строк:

Рисунок 7 – Просмотр данных таблицы Users

База данных готова. Теперь нам надо добавить подключение в файл конфигурации приложения. В обозревателе решений найдем файл App.config

и откроем его. Перед закрывающим тегом </configuration> добавим новую секцию connectionStrings:

<?xml version="1.0" encoding="utf-8" ?> <configuration>

<startup>

6

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /> </startup>

<connectionStrings>

<add name="UserDB" connectionString="data source=(localdb)\MSSQLLocalDB;Initial Catalog=userdb;Integrated Security=True;" providerName="System.Data.SqlClient"/> </connectionStrings>

</configuration>

Теперь определим классы модели данных и контекста. Добавим класс

модели User:

Листинг 17.1 – Класс User

1

class User

2

{

3

public int Id { get; set; }

4

public string Name { get; set; }

5

public int Age { get; set; }

6

public string Log { get; set; }

7

public string Password { get; set; }

8

}

Основу функциональности Entity Framework составляют классы,

находящиеся в пространстве имен System.Data.Entity. Среди всего набора классов этого пространства имен следует выделить следующие:

DbContext: определяет контекст данных, используемый для взаимодействия с базой данных.

DbModelBuilder: сопоставляет классы на языке C# с сущностями в базе данных.

DbSet/DbSet<TEntity>: представляет набор сущностей, хранящихся в базе данных

Влюбом приложении, работающим с базой данных через Entity Framework, нам нужен будет контекст (класс производный от DbContext) и

набор данных DbSet, через который мы сможем взаимодействовать с таблицами из базы данных. В данном случае таким контекстом является класс

UserContext.

7

 

Добавим класс контекста данных UserContext:

 

Листинг 17.2 – Класс UserContext

 

 

 

1

class UserContext : DbContext

 

2

{

 

3

public UserContext() : base("UserDB")

 

4

{ }

 

5

public DbSet<User> Users { get; set; }

 

6

}

 

В конструкторе этого класса вызывается конструктор базового класса, в

который передается строка "UserDB" – это имя будущей строки подключения к базе данных. В принципе мы можем не использовать конструктор, тогда в этом случае строка подключения носила бы имя самого класса контекста данных, например: <add name="UserContext" connectionString=".

Итакже в классе определено одно свойство Users, которое будет хранить набор объектов User. В классе контекста данных набор объектов представляет класс DbSet<T>. Через это свойство будет осуществляться связь

стаблицей объектов User в базе данных.

Идля получения данных определим следующий код в приложении:

 

Листинг 17.3 – Получение данных из БД

 

 

 

1

public Form1()

 

2

{

 

3

InitializeComponent();

 

4

using (UserContext db = new UserContext())

 

5

{

 

6

foreach (User u in db.Users)

 

7

{

 

8

listBox1.Items.Add(u.Id + "." + u.Name + " - " +

 

u.Age);

 

 

 

9

}

 

10

}

 

11

}

 

12

private void buttonAdd_Click(object sender, EventArgs

 

e)

 

13

{

 

14

using (UserContext db = new UserContext())

 

15

{

 

 

8

 

 

User user1 = new User(textBoxName.Text,

16

Convert.ToInt32(textBoxAge.Text), textBoxLog.Text,

 

textBoxPassword.Text);

17

db.Users.Add(user1);

18

db.SaveChanges();

19

listBox1.Items.Add(user1.Id + "." + user1.Name + " -

 

" + user1.Age);

20

}

21

}

 

Форма для взаимодействия с БД представлена на рисунке 8.

Рисунок 8

Так как класс UserContext через родительский класс DbContext

реализует интерфейс IDisposable, то для работы с UserContext с

автоматическим закрытием данного объекта мы можем использовать конструкцию using.

§17.3 Соглашения по наименованию в Code First

При создании таблиц и их столбцов в базе данных в Entity Framework по умолчанию действуют некоторые соглашения по именованию, которые указывают, какие имена должны быть у таблиц, столбцов, какие типы и т.д.

Рассмотрим некоторые из этих соглашений.

Сопоставление типов

Типы SQL Serverа и C# сопоставляются следующим образом:

int : int

bit : bool

char : string

9

date : DateTime

datetime : DateTime

datetime2 : DateTime

decimal : decimal

float : double

money : decimal

nchar : string

ntext : string

numeric : decimal

nvarchar : string

real : float

smallint : short

text : string

tinyint : byte

varchar : string

NULL и NOT NULL

Все первичные ключи по умолчанию имеют определение NOT NULL.

Столбцы, сопоставляемые со свойствами ссылочных типов (string, array), в базе данных имеют определение NULL, а все значимые типы

(DateTime, bool, char, decimal, int, double, float) - NOT NULL.

Ключи

Entity Framework требует наличия первичного ключа, так как это позволяет ему отслеживать объекты. По умолчанию в качестве ключей EF

рассматривает свойства с именем Id или [Название_типа]Id (например, PostId в классе Post).

Как правило, ключи имеют тип int или GUID, но также могут представлять и любой другой примитивный тип.

Названия таблиц и столбцов

10