Лекции / Глава 17.3 Entity Framework
.pdf
|
|
преподавателя из коллекции |
|
|
|
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 (аналогичное просмотрю информации о преподавателе).