С#. Связь один ко многим. Практический пример

Воспользуемся теоретическим материалом из прошлой темы и создадим новое приложение, в котором будет реализована связь один-ко-многим. Для реализации подобной связи будем использовать lazy loading.

Создадим новый проект Windows Forms. Первым делом подключим через NuGet Entity Framework и добавим все наши модели. Итак, добавим следующие классы:

В нашем графическом приложении будет четыре формы: для списка футболистов, для списка команд, для добавления/редактирования футболиста и для добавления/изменения команды.

Пусть форма, которая уже есть по умолчанию, будет представлять футболистов и иметь следующий вид:

В нашем графическом приложении будет четыре формы: для списка футболистов, для списка команд, для добавления/редактирования футболиста и для добавления/изменения команды.

Пусть форма, которая уже есть по умолчанию, будет представлять футболистов и иметь следующий вид:

Связь один ко многим в Entity Framework

Здесь у нас элемент DatatGridView для отображения данных, а также три кнопки для добавления/редактирования/удаления и одна кнопка для вызова окна с футбольными командами.

Итак, в предыдущих темах мы уже рассматривали привязку данных к DataGridView. При привязке для каждого свойства создается столбец. Однако свойство TeamId нам не нужно. Да и было бы неплохо, если бы в качестве заголовков отображались те названия, какие мы хотим, а не названия свойств. Поэтому выделим DatatGridView и окне свойств найдем для него свойство DataSource. Нажмем, чтобы установить для него значение, и нам отобразится окно выбора источника данных:

Нажмем на ссылку Add Project Data Source…. После этого нам откроется окно мастера настройки источника данных, в котором нам надо выбрать Object:

И затем на следующем шаге нам отобразится струкура проекта, в которой в одном из узлов найдем наш класс Player:

После этого в DataGridView будут добавлены заголовки по именам свойств. Перейдем в свойство Columns у DataGridView. В свойстве HeaderText установим для всех заголовков предпочтительное название, которое будет отображаться, а столбец TeamId удалим.

Подобным образом сделаем графический интерфейс и для формы с командами, назовем ее, к примеру, AllTeams:

lazy loading или ленивая загрузка в Entity Framework

Здесь также DataGridView для отображения списка команд, а также поле ListBox и кнопка ‘Состав’ для вывода в этом поле всех игроков выбранной команды.

Добавим также дополнительные формы для создания и изменения игрока и команды. Форма для игрока, назовем ее PlayerForm:

Здесь текстовое поле для имени игрока, элемент NumericUpDown для указания возраста, и два элемента ComboBox.

Для кнопки ‘OK’ у свойства DialogResult установим значение OK, а у кнокпки ‘Отмена’ установим значение Cancel. И изменим у всех полей значение свойства Modifiers с Private на Protected Internal.

И форма для создания команды TeamForm:

Для кнопок и полей также настроим свойство DialogResult и Modifiers, как и у предыдущей формы.

Код главной формы с игроками:

Тут тот же самый функционал, что рассматривался на примере простого приложения в одной из предыдущих тем. Только появляется дополнительное поле для выбора команды, в которое нам сначала надо загрузить все команды и настроить привязку:

А при редактировании мы устанавливаем для этого поля значение, равное TeamId: plForm.comboBox2.SelectedValue = player.Team.Id. Здесь благодаря lazy loading мы можем получить связанную с игроком команду и обратиться к ее свойствам.

Код формы команд:

На что здесь надо обратить внимание? Во-первых, здесь так же благодаря lazy loading мы можем получить связанных с командой игроков и загрузить их в ListBox: listBox1.DataSource = team.Players.ToList();

Во-вторых, при удалении мы предварительно очищаем данный список: team.Players.Clear();. Если бы мы вручную создавали базу данных, а потом через entity framework через database first или code first подключали бы к проекту, то мы могли бы не очищать список, установив при создании внешнего ключа в бд каскадное удаление или установку в null поля игрока при удалении связанной команды.

This entry was posted in C#. Bookmark the permalink.

Leave a Reply