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

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

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

Рисунок 21

Поскольку модель будет описывать человека, то назовем ее User.

Нажмем Добавить и нам откроется мастер создания модели.

Рисунок 22

Окно нам предлагает четыре варианта создания модели, из которых нам надо выбрать Пустая модель конструктор в EF.

Нажмем кнопку Готово, и перед нами откроется пустое окно создания модели.

21

Перетащим на это поле с панели Панель Инструментов в левой части элемент Сущность. Теперь у нас на поле создания модели имеется небольшая схема будущей модели, в которой сейчас по умолчанию указано лишь одно поле - Id. Во-первых, переименуем сущность. По умолчанию она называется

Entity1.

Рисунок 23 – Схема модели и панель элементов

Выделим схему и перейдем к окну свойств в правом нижнем углу:

Рисунок 24 – Свойства сущности

Здесь изменим значение свойства Имя на User. Это у нас будет имя сущности. И также изменим значение свойства Имя набора сущностей на

Users. Это у нас будет название набора объектов User.

Далее создадим несколько свойств. Сущность у нас будет простая и будет содержать всего два свойства для логина и пароля пользователя. Итак,

выделим схему сущности и нажмем на правую кнопку мыши. В выпадающем списке выберем Добавить новый → Скалярное свойство. После этого будет добавлено новое свойство. Скалярное свойство подразумевают свойства на

22

основе простейших типов int, float, string и т.д. Добавим два свойства – Log и Password. По умолчанию все добавляемые свойства имеют тип string. Однако мы можем изменить тип в окне свойств.

Таким образом, у нас должна получиться следующая схема сущности:

Рисунок 25 – Сущность «Пользователь»

После создания диаграммы модели перестроим проект с помощью опции Перестроить.

Теперь по модели мы можем сгенерировать код и базу данных. Вначале сгенерируем код модели. Для этого нажмем на диаграмму модели правой кнопкой мыши и выберем пункт Добавить элемент создания кода:

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

Рисунок 26

23

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

Рисунок 27

Также здесь мы можем найти файл контекста данных User.Context.cs,

который выглядит в моем случае следующим образом:

Листинг 17.6

1

namespace USER_MODEL_FIRST

2

{

3

using System;

4

using System.Data.Entity;

5

using System.Data.Entity.Infrastructure;

6

public partial class UserContainer : DbContext

7

{

8

public UserContainer() : base("name=UserContainer")

9

{}

10

protected override void

OnModelCreating(DbModelBuilder modelBuilder)

11

{

12

throw new UnintentionalCodeFirstException();

13

}

14

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

Теперь сгенерируем базу данных по нашей модели. Итак, нажмем на

диаграмму модели правой кнопкой мыши и в выпадающем списке выберем

24

Сформировать базу данных на основе модели. Перед нами откроется мастер создания подключения.

Рисунок 28

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

Рисунок 29

25

Здесь нам надо ввести название базы данных. В качестве имени базы данных введем usersdb. Нажмем OK и затем Visual Studio установит в качестве подключения модели только что созданную базу данных. После этого будет сгенерирован скрипт базы данных:

Рисунок 30

Нажмем Готово. У нас автоматически откроется в Visual Studio файл скрипта User.edmx.sql. И в завершении нам надо будет запустить этот скрипт.

Для этого нажмем в верхнем левом углу на зеленую кнопку Выполнить:

Рисунок 31

После этого в нижнем окне Visual Studio нам сообщит об успешном (или неуспешном) создании базы данных. Если мы откроем окно Обозреватель серверов (его можно открыть, выбрав в меню Вид → Другие окна), то мы увидим нашу базу данных. А раскрыв узел, также увидим, что она содержит всю ту схему, которую мы определили в модели:

26

Рисунок 32

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

Большинство операций с данными представляют собой CRUD-

операции (Create, Read, Update, Delete), то есть получение данных, создание,

обновление и удаление. Entity Framework позволяет легко производить данные операции.

Для примеров с операциями возьмем модель User, созданную в предыдущем параграфе:

Листинг 17.7

1

public partial class User

 

2

{

 

3

public int Id { get; set; }

 

4

public string Log { get; set; }

 

5

public string Password { get; set; }

 

6

}

 

 

И следующий класс контекста данных:

 

Листинг 17.8

 

 

 

1

public partial class UserContainer : DbContext

 

2

{

 

3

public UserContainer() : base("name=UserContainer")

 

{}

 

 

 

4

protected override void

 

OnModelCreating(DbModelBuilder modelBuilder)

 

 

 

5

{

 

6

throw new UnintentionalCodeFirstException();

 

7

}

 

8

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

 

9

}

 

 

27

 

Добавление (CREATE)

Создадим форму добавления новых объектов:

 

Рисунок 33

 

Для добавления применяется метод Add() у объекта DbSet:

 

Листинг 17.9

 

 

 

1

using (UserContainer db = new UserContainer())

 

2

{

 

3

User user = new User() { Log = textBoxLog.Text,

 

Password = textBoxPassword.Text };

 

 

 

4

db.Users.Add(user);

 

5

db.SaveChanges();

 

6

}

 

7

listBoxUsers.Items.Clear();

 

8

using (UserContainer db = new UserContainer())

 

9

{

 

10

foreach (var item in db.Users)

 

11

{

 

12

listBoxUsers.Items.Add(item.Log);

 

13

}

 

14

}

 

 

После добавления надо сохранить все изменения с помощью метода

SaveChanges(). В строках 7-13 происходит обновление списка – в него загружаются все элементы из таблицы Users.

28

Рисунок 34

Обновление (UPDATE)

Создадим форму редактирования объектов, хранящихся в таблице

Users:

Рисунок 35

Контекст данных способен отслеживать изменения объектов, поэтому для редактирования объекта достаточно изменить его свойства и после этого вызвать метод SaveChanges():

 

Листинг 17.10

 

 

 

1

User user = null;

 

 

 

 

2

using (UserContainer db = new UserContainer())

 

 

 

 

3

{

 

 

 

 

4

foreach (var item in db.Users)

 

 

 

 

5

{

 

 

 

 

6

if (item.Log == (string)listBoxUsers.SelectedItem)

 

 

 

 

7

{

 

 

 

 

8

user = db.Users.Find(item.Id);

 

 

 

 

9

}

 

 

 

 

10

}

 

 

 

 

11

user.Log = textBoxNewLog.Text;

 

 

29

 

12

user.Password = textBoxNewPassword.Text;

 

 

13

db.SaveChanges();

 

 

14

}

 

 

Здесь user – объект, который выбирается из списка listBoxUsers для дальнейшего редактирования.

Для поиска искомого объекта в базе данных используется метод Find

класса DbSet, использующий в качестве параметра значение первичного ключа, чтобы найти сущность, отслеживаемую контекстом данных. Если сущность не найдена в контексте, запрос отправляется в базу данных для поиска сущности там. Если сущность не найдена в контексте или в базе данных, возвращается значение NULL.

Рассмотрим ситуацию, где объект User будет получен в одном контексте, а изменять свои значения будет для другого контекста, который его не отслеживает:

 

Листинг 17.11

 

 

 

1

User user = null;

 

2

using (UserContainer db = new UserContainer())

 

3

{

 

4

foreach (var item in db.Users)

 

5

{

 

6

if (item.Log == (string)listBoxUsers.SelectedItem)

 

7

{

 

8

user = db.Users.Find(item.Id);

 

9

}

 

10

}

 

11

}

 

12

using (UserContainer db = new UserContainer())

 

13

{

 

14

user.Log = textBoxNewLog.Text;

 

15

user.Password = textBoxNewPassword.Text;

 

16

db.SaveChanges();

 

17

}

 

В итоге при попытке обновления изменения не сохранятся. Чтобы изменения сохранились, нам явным образом надо установить для состояния объекта значение EntityState.Modified:

30