|
|
Листинг 17.28 |
|
|
|
|
|
Создание объекта SelectedUser для хранения |
1 |
User SelectedUser = null; |
пользователя, у которого надо изменить значения |
|
|
атрибутов |
|
|
|
2 |
using (UserContext db = new UserContext()) |
Подключение контекста данных UserContext |
|
||
|
|
|
3 |
{ |
|
|
|
|
|
|
Цикл для обработки элементов коллекции |
4 |
foreach (User user in db.Users) |
db.Users (коллекция сущностей Users из базы |
|
||
|
|
данных) |
|
|
|
5 |
{ |
|
|
|
|
|
|
Проверка на совпадение логина пользователя |
|
|
this.User, для которого выбрана опция |
6 |
if(user.Login == this.User.Login) |
изменения данных, с логином каждого |
|
|
|
|
|
пользователя из базы данных |
|
|
|
7 |
{ |
|
|
|
|
|
|
При совпадении логина – присваиваем |
8 |
SelectedUser = user; |
переменной SelectedUser ссылку на объект |
|
||
|
|
user (найденный элемент из базы данных) |
|
|
|
16
9 |
} |
|
|
|
|
10 |
} |
|
|
|
|
11 |
SelectedUser.Login = textBoxLogin.Text; |
Изменение логина у найденного пользователя |
|
||
|
|
|
12 |
SelectedUser.Password = textBoxPassword.Text; |
Изменение пароля у найденного пользователя |
|
||
|
|
|
|
SelectedUser.Profile.PersonalDate = |
Изменение данных «О себе» у найденного |
13 |
|
|
textBoxPersonalData.Text; |
пользователя |
|
|
|
|
|
|
Сохранение изменений результата запроса в базе |
14 |
db.SaveChanges(); |
данных |
|
|
|
|
|
|
15 |
} |
|
|
|
|
|
MessageBox.Show("Изменения сохранены", |
Вывод сообщения об успешности завершения |
16 |
|
|
"Сообщение"); |
операции |
|
|
|
|
17 |
this.Visible = false; |
Скрытие текущей формы |
|
||
|
|
|
|
|
Открытие формы просмотра учетной записи |
18 |
FormStudentAccount.Visible = true; |
студента |
|
|
|
|
|
|
При удалении надо учитывать следующее: так как объект UserProfile требует наличие объекта User и зависит от этого объекта, то при удалении связанного объекта User надо будет удалить и связанный с ним объект UserProfile,
поскольку по умолчанию у нас не предусмотрено каскадное удаление при данной связи. Если же будет удален объект
UserProfile, на объект User это никак не повлияет:
17
|
|
Листинг 17.29 |
|
|
|
1 |
using(UserContext db = new UserContext()) |
Подключение контекста данных UserContext |
|
|
|
2 |
{ |
|
|
|
|
|
|
Цикл для обработки элементов коллекции |
|
|
db.Users (коллекция сущностей Users из базы |
3 |
foreach(User user in db.Users.ToList()) |
данных). Здесь коллекция db.Users |
|
|
преобразуется из DbSet в коллекцию List с |
|
|
помощью метода ToList(). |
|
|
|
4 |
{ |
|
|
|
|
|
|
Проверка на совпадение Id пользователя со |
|
|
значением, выбранным в списке listBoxUsers. |
5 |
if (user.Id == (string)listBoxUsers.SelectedItem) |
Так как свойство SelectedItem возвращает |
|
|
значение в типе данных object, необходимо |
|
|
преобразование в строковый тип (string). |
|
|
|
6 |
{ |
|
|
|
|
|
|
Проверка на ненулевое значение атрибута |
7 |
if (user.Profile != null) |
UserProfile у сущности User (наличие у |
|
|
пользователя профиля с личными данными) |
|
|
|
|
18 |
|
8 |
{ |
|
|
|
|
|
|
|
|
Если профиль существует, то происходит |
|
|
|
удаление профиля с помощью метода Remove. |
|
9 |
db.UserProfiles.Remove(user.Profile); |
Метод Remove применяется по отношению к |
|
коллекции UserProfiles из контекста данных и |
|||
|
|
||
|
|
в качестве параметра в него передается ссылка на |
|
|
|
удаляемый объект user.Profile. |
|
|
|
|
|
10 |
} |
|
|
|
|
|
|
|
|
Удаление пользователя с помощью метода |
|
|
|
Remove, который применяется по отношению к |
|
11 |
db.Users.Remove(user); |
коллекции Users из контекста данных и в |
|
|
|
качестве параметра в него передается ссылка на |
|
|
|
удаляемый объект user |
|
|
|
|
|
12 |
db.SaveChanges();}}} |
Сохранение изменений результата запроса в базе |
|
данных |
|||
|
|
||
|
|
|
19
§17.10 Связь один ко многим
Связь один-ко-многим реализуется, если одна модель хранит ссылку на один объект другой модели, а вторая модель может ссылаться на коллекцию объектов первой модели. Например, у одного дипломного руководителя может существовать несколько тем для дипломных проектов, которые он может предложить студентам:
Листинг 17.30
1 |
public class Professor |
|
2 |
{ |
|
3 |
[Key, ForeignKey("UserProfile")] |
|
4 |
public int Id { get; set; } |
|
5 |
public string Name { get; set; } |
|
6 |
public string Position { get; set; } |
|
7 |
public string PersonalData { get; set; } |
|
8 |
public virtual UserProfile UserProfile { get; set; } |
|
9 |
public virtual ICollection<Thesis> Theses { get; set; |
|
} |
||
|
||
10 |
public Professor() |
|
11 |
{ |
|
12 |
this.Theses = new List<Thesis>(); |
|
13 |
} |
|
14 |
} |
|
|
|
|
15 |
public class Thesis |
|
16 |
{ |
|
17 |
public int Id { get; set; } |
|
18 |
public string Name { get; set; } |
|
19 |
public int? ProfessorId { get; set; } |
|
20 |
public virtual Professor Professor { get; set; } |
|
21 |
} |
|
|
|
Обычное свойство ProfessorId и навигационное свойство Professor
будет представлять собой внешний ключ подчиненной сущности Thesis.
Таким же образом в классе Team создается навигационное свойство Players,
представляющее собой интерфейс обобщенной коллекции
ICollection<Thesis>, через которое мы можем получать предлагаемые темы дипломных работ определенного преподавателя.
20