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

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

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

 

 

преподавателя из коллекции

 

 

db.ProfessorSet

 

 

 

10

}

 

 

 

 

11

}

 

 

 

 

12

buttonShowProfessors.Text = "Просмотр";

Изменение надписи кнопки

buttonShowProfessors на «Просмотр»

 

 

 

 

 

13

}

 

 

 

 

 

 

Если условие в строке 3 ложно, то

14

else if(buttonShowProfessors.Text == "Просмотр")

производится проверка на равенство надписи

кнопки buttonShowProfessors значению

 

 

 

 

"Просмотр"

 

 

 

15

{

 

 

 

 

 

this.FormProfessorInfo = new

Создание формы FormProfessorInfo и

16

передача в конструктор формы ссылки на

FormProfessorInfo(this);

 

экземпляр текущего класса (формы)

 

 

 

 

 

17

using (EntityModelContainer db = new

Создание объекта db контекста данных

EntityModelContainer())

EntityModelContainer

 

 

 

 

18

{

 

 

 

 

 

 

Цикл для обработки элементов коллекции

19

foreach (Professor professor in db.ProfessorSet)

db.ProfessorSet (коллекция сущностей

 

 

ProfessorSet из базы данных)

 

 

 

20

{

 

 

 

 

 

 

Проверка на равенство значения свойства

 

 

Name объекта professor из коллекции

21

if (professor.Name ==

db.ProfessorSet элементу, выбранному в

Convert.ToString(listBoxLecturer.SelectedItem))

списке listBoxLecturer (свойство

 

 

 

SelectedItem возвращает значение

 

 

выбранного элемента в списке)

 

 

 

 

 

Если условие в строке 21 истинно, то в

22

{

таблице ProfessorSet базы данных был

найден объект professor с именем, которое

 

 

 

 

выбрано в списке listBoxLecturer

 

 

 

23

this.FormProfessorInfo.Show();

Открытие формы FormProfessorInfo

 

 

 

24

this.FormProfessorInfo.richTextBoxName.Text =

Изменение текста элемента

professor.Name;

richTextBoxName на значение свойства

 

 

 

 

 

 

Name объекта professor (ФИО

 

 

преподавателя)

 

 

 

 

 

Изменение текста элемента

25

this.FormProfessorInfo.richTextBoxPosition.Text =

richTextBoxPosition на значение

professor.Position;

свойства Position объекта professor

 

 

 

(Должность преподавателя)

 

 

 

 

 

Изменение текста элемента

26

this.FormProfessorInfo.richTextBoxPersonalData.Text

richTextBoxPersonalData на значение

= professor.PersonalData;

свойства PersonalData объекта professor

 

 

 

(Информация «О себе» преподавателя)

 

 

 

 

 

Изменение отображаемого изображения в

 

this.FormProfessorInfo.pictureBoxPhoto.Image =

pictureBoxPhoto путем последовательного

27

(Image)((new

преобразования массива байтов, хранящихся

 

ImageConverter()).ConvertFrom(professor.Photo));

в свойстве Photo объекта professor в тип

 

 

данных Image

 

 

 

28

}}}

 

 

 

 

29

this.Visible = false;

Скрытие формы профиля студента

 

 

 

30

}}

 

 

 

 

§17.17.4 Добавление темы дипломной работы

Добавление темы происходит по нажатию кнопки Добавить в форме профиля преподавателя. Тема дипломной работы записывается в текстовое поле richTextBoxNameThesis.

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

 

Листинг 17.6 – Конструктор формы профиля преподавателя

 

 

 

1

Form1 Form1;

 

2

User User;

 

3

public FormProfessorAccount(Form1 form1, User user)

 

4

{

 

5

InitializeComponent();

 

6

this.Form1 = form1;

 

7

this.User = user;

 

8

this.UpdateListBoxTheses();

 

9

}

 

Конструктор принимает в качестве параметра ссылку на форму авторизации form1 для возможности перехода в нее обратно и ссылку на объект user, для которого будет происходить открытие профиля, и

информация о котором будет появляться в открываемой форме.

При реализации добавления используем запросы LINQ.

LINQ to Entities предлагает простой и интуитивно понятный подход для получения данных с помощью выражений, которые по форме близки выражениям языка SQL.

Хотя при работе с базой данных мы оперируем запросами LINQ, но база данных понимает только запросы на языке SQL. Поэтому между LINQ to Entities и базой данных есть проводник, который позволяет им взаимодействовать. Этим проводником является провайдер EntityClient. Он создает интерфейс для взаимодействия с провайдером ADO.NET для SQL Serverа.

Для начала взаимодействия с базой данных создается объект

EntityConnection. Через объект EntityCommand он отправляет запросы, а с помощью объекта EntityDataReader считывает извлеченные из базы данных

данные. Однако разработчику не надо напрямую взаимодействовать с этими объектами, фреймворк все сделает за него. Задача же разработчика сводится в основном к написанию запросов к базе данных с помощью LINQ.

Рассмотрим реализацию метода обработчика события нажатия на кнопку Добавить, которая представлена в листинге 17.7.

Листинг 17.7 – Добавление темы

1

private User User;

2

private void buttonAddThesis_Click(object sender,

EventArgs e)

 

3

{

4

using(EntityModelContainer db = new

EntityModelContainer())

 

5

{

 

Professor ModifiableProfessor =

6

(from p in db.ProfessorSet

where p.Name == User.Professor.Name

 

 

select p).FirstOrDefault();

 

Thesis thesis = new Thesis() { Name =

7

richTextBoxNameThesis.Text, Annotation =

richTextBoxNameThesis.Text, Professor =

 

 

ModifiableProfessor };

8

db.ThesisSet.Add(thesis);

9

ModifiableProfessor.Thesis.Add(thesis);

10

db.SaveChanges();

11

}

12

this.UpdateListBoxTheses();

13

}

Встроке 6 создается объект ModifiableProfessor класса Professor,

вкоторый сохраняется результат запроса LINQ на выборку. В данном запросе мы отбираем элементы p из коллекции, у которых свойство Name равно значению аналогичного свойства у объекта User.Professor. User хранит данные об объекте-пользователе, для которого открыта форма профиля. Метод

FirstOrDefault() получает первый элемент полученной выборки (в данном случае – преподавателя, для которого выполнено условие выборки). Если выборка пуста, то он возвращает значение null.

При добавлении темы создается объект thesis класса Thesis и

инициализируются его свойства: Name, Annotation и Professor.

Свойству

Professor объекта thesis присваивается ссылка на

объект

ModifiableProfessor.

После создания темы происходит закрепление темы дипломного проекта за преподавателем. Для этого происходит обращение к свойству-коллекции

Thesis объекта ModifiableProfessor и добавление в нее ранее созданной темы thesis.

Метод UpdateListBoxTheses обновляет содержимое списка тем дипломных проектов. Его реализация представлена в листинге 17.8.

Листинг 17.7 – Обновление списка

1

private void UpdateListBoxTheses()

 

 

 

2

{

 

 

 

 

3

this.listBoxTheses.Items.Clear();

 

 

 

4

using

(EntityModelContainer

db

=

new

EntityModelContainer())

 

 

 

 

 

 

 

5

{

 

 

 

 

 

var ThesesList =

 

 

 

 

from t in db.ThesisSet

 

 

 

6

where t.Professor.Name == (from p in db.ProfessorSet

 

where p.Name == User.Professor.Name

 

 

 

 

select p).FirstOrDefault().Name

 

select t;

 

 

 

 

7

foreach (Thesis thesis in ThesesList)

 

 

8

{

 

 

 

 

9

this.listBoxTheses.Items.Add(thesis.Name);

 

 

10

}

 

 

 

 

11

}

 

 

 

 

12}

Встроке 6 реализован запрос LINQ – здесь идет выборка тем

дипломных проектов у преподавателя.

§17.17.5 Редактирование темы дипломной работы

Редактирование темы происходит по нажатию кнопки Изменить в

форме профиля преподавателя. Измененная тема дипломной работы записывается в текстовое поле richTextBoxNewName.

Рассмотрим реализацию метода обработчика события нажатия на кнопку Изменить, которая представлена в листинге 17.9.

Листинг 17.9 – Редактирование темы

1

private void buttonChangeThesis_Click(object

sender,

EventArgs e)

 

 

 

 

 

 

 

2

{

 

 

 

3

using(EntityModelContainer

db

=

new

EntityModelContainer())

 

 

 

 

 

 

 

4

{

 

 

 

5

string

str

 

=

Convert.ToString(listBoxTheses.SelectedItem);

 

 

 

 

Thesis ModifiableThesis =

 

 

 

6

 

(from t in db.ThesisSet

 

where t.Name == str

 

 

 

 

select t).FirstOrDefault();

7

ModifiableThesis.Name = richTextBoxNewName.Text;

8

db.SaveChanges();

 

 

 

9

}

 

 

 

10

this.UpdateListBoxTheses();

 

 

11

}

 

 

 

В строковую переменную str сохраняется наименование темы,

выбранной в списке listBoxTheses. В строке 6 происходит создание объекта

ModifiableThesis класса Thesis, которому присваивается результат выполнения запроса на выборку, где ищется совпадение наименования темы каждой дипломной работы t.Name, хранящейся в таблице ThesisSet базы данных со строкой str. В строке 7 происходит обращение к свойству Name

объекта ModifiableThesis и присваивание ему нового значение, которое будет задано в текстовом поле richTextBoxNewName, то есть происходит изменение наименования темы дипломной работы, найденной в базе данных.

§17.17.6 Удаление темы дипломной работы

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

Реализация метода обработчика события нажатия на кнопку Удалить

представлена в листинге 17.10.

Листинг 17.10 – Удаление темы

1

private

void buttonDeleteThesis_Click(object

sender,

EventArgs e)

 

 

 

 

 

 

 

2

{

 

 

 

 

3

using

(EntityModelContainer

db

=

new

EntityModelContainer())

 

 

 

 

 

 

 

4

{

 

 

 

 

5

string

str

 

 

=

Convert.ToString(listBoxTheses.SelectedItem);

 

 

 

 

Thesis ModifiableThesis = (from t in db.ThesisSet

6

where t.Name == str

 

 

 

 

select t).FirstOrDefault();

 

 

 

7

db.ThesisSet.Remove(ModifiableThesis);

 

 

8

db.SaveChanges();

 

 

 

9

}

 

 

 

 

10

this.UpdateListBoxTheses();

 

 

 

11

}

 

 

 

 

Реализация удаления темы мало отличается от метода редактирования темы. Единственное отличие – строка 7. В ней происходит вызов метода

Remove коллекции ThesisSet, который выполняет удаление объекта

ModifiableThesis.

§17.17.7 Просмотр информации о студентах

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

Реализация метода обработчика события нажатия на кнопку Поиск студентов представлена в листинге 17.11.

Листинг 17.11 – Поиск студентов

1

private void buttonFind_Click(object sender, EventArgs e)

2 {

3

FormOverviewStudent

formOverviewStudent

=

new

FormOverviewStudent(this);

 

 

 

 

 

4

formOverviewStudent.Show();

 

 

5

this.Visible = false;

 

 

 

6

}

 

 

 

При нажатии на кнопку в строке 3 создается форма просмотра информации о студентах formOverviewStudent, конструктор которой принимается ссылку на текущую форму. В строке 4 происходит открытие

новой формы, а в строке 5 – закрытие формы профиля преподавателя.

Реализация конструктора класса формы представлена в листинге 17.12.

Листинг 17.12 – Конструктор формы FormOverviewStudent

1

public

FormOverviewStudent(FormProfessorAccount

formProfessorAccount)

 

 

 

 

 

 

 

2

{

 

 

 

 

3

InitializeComponent();

 

 

 

4

this.FormProfessorAccount = formProfessorAccount;

 

5

using

(EntityModelContainer

db

=

new

EntityModelContainer())

 

 

 

 

 

 

 

6

{

 

 

 

 

7

foreach (User user in db.UserSet)

 

 

 

8

{

 

 

 

 

9

if (user.Student != null)

 

 

 

10

{

 

 

 

 

11

listBoxStudents.Items.Add(user.Student.Name);

 

12

}

 

 

 

 

13

}

 

 

 

 

14

}

 

 

 

 

15

}

 

 

 

 

В конструкторе происходит заполнение списка listBoxStudents

элементами коллекции db.UserSet, которые являются студентами.

Проверить на принадлежность пользователя роли студента можно, сравнив свойство Student на неравенство значению null или на равенство свойства

Role значению «Студент».

Вывод информации о студенте происходит при выборе ФИО студента в списке listBoxStudents. Реализация метода обработчика события нажатия на элемент списка представлен в листинге 17.13.

Листинг 17.13 – Вывод информации о выбранном студенте

 

private

 

 

 

 

void

1

listBoxStudents_SelectedIndexChanged(object

 

sender,

 

EventArgs e)

 

 

 

 

2

{

 

 

 

 

 

3

using

(EntityModelContainer

db

=

new

EntityModelContainer())

 

 

 

 

 

 

 

 

 

4

{

 

 

 

 

 

5

if (listBoxStudents.SelectedItem != null)

 

 

6

{

 

 

 

 

 

7

string

 

SelectedName

 

=

Convert.ToString(listBoxStudents.SelectedItem);

 

 

Student student =

 

 

 

 

8

 

 

(from s in db.StudentSet

 

 

where s.Name == SelectedName

 

 

 

 

 

 

select s).FirstOrDefault();

 

 

 

 

9

richTextBoxName.Text = student.Name;

 

 

10

richTextBoxNumberGroup.Text

 

 

=

 

Convert.ToString(student.NumberGroup);

 

 

11

richTextBoxPersonalData.Text = student.PersonalData;

12

pictureBoxPhoto.Image

=

(Image)(Image)((new

ImageConverter()).ConvertFrom(student.Photo));

 

13

}

 

 

 

 

 

14

else

 

 

 

 

 

15

{

 

 

 

 

 

16

MessageBox.Show("Ошибка выбора");

 

 

 

17

}

 

 

 

 

 

18

}

 

 

 

 

 

19

}

 

 

 

 

 

В строке 7 создается строковая переменная SelectedName, в которую сохраняется ФИО студента, выбранное в списке listBoxStudents. В строке

8 создается объект student, которому присваивается результат выполнения запроса на выборку, где ищется совпадение ФИО студента s.Name,

хранящейся в таблице StudentSet базы данных со строкой SelectedName.

Далее происходит вывод в соответствующие текстовые поля ФИО, номера группы и информации «О себе» выбранного в списке студента и вывод фотографии студента в pictureBoxPhoto (аналогичное просмотрю информации о преподавателе).