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

Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core

Последнее обновление: 31.10.2015

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

using System.Data.Entity;
........................
class SoccerContext : DbContext
{
    public SoccerContext() : base("SoccerDB2")
    { }
	
    public DbSet<Team> Teams { get; set; }
    public DbSet<Player> Players { get; set; }
}

И определим модели:

public class Team
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Coach { get; set; }

    public virtual ICollection<Player> Players { get; set; }
	public Team()
    {
        Players = new List<Player>();
    }
}
public class Player
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    public virtual ICollection<Team> Teams { get; set; }
	public Player()
    {
        Teams = new List<Team>();
	}
}

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

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

Основной функционал будет таким же, как и в прошлой теме: один элемент DataGridView и четыре кнопки. Кроме того нам потребуется две дополнительные формы: одна для создания команды, а другая - для создания/редактирования игрока.

Добавим в проект новую форму. Назовем ее, к примеру, PlayerForm:

Здесь текстовое поле для указания имени, поле NumericUpDown для возраста и элемент ListBox, в котором будут выводиться команды. Установим у этих элементов значение свойства Modifier равным Protected Internal.

Также есть две кнопки. Установим у кнопки 'ОК' значение свойства DialogResult равным OK, а у кнопки 'Отмена' - равным Cancel.

Форма для добавления команд, назовем ее TeamForm, будет выглядеть следующим образом:

Произведем у этой формы ту же настройку с полями и кнопками, как и у предыдущей формы.

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

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

using System.Data.Entity;

public partial class Form1 : Form
{
    SoccerContext db;

    public Form1()
    {
        InitializeComponent();

        db = new SoccerContext();
        db.Players.Load();
        dataGridView1.DataSource = db.Players.Local.ToBindingList();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        PlayerForm plForm = new PlayerForm();

        // добавляем список команд на форму plForm
        List<Team> teams = db.Teams.ToList();
        plForm.listBox1.DataSource = teams;
        plForm.listBox1.ValueMember = "Id";
        plForm.listBox1.DisplayMember = "Name";

        DialogResult result = plForm.ShowDialog(this);
        if (result == DialogResult.Cancel)
            return;

        Player player = new Player();
        player.Age = (int)plForm.numericUpDown1.Value;
        player.Name = plForm.textBox1.Text;

        teams.Clear(); // очищаем список и заново заполняем его выделенными элементами
        foreach (var item in plForm.listBox1.SelectedItems)
        {
            teams.Add((Team)item);
        }
        player.Teams = teams;
        db.Players.Add(player);
        db.SaveChanges();

        MessageBox.Show("Новый игрок добавлен");
    }

    // редактирование
    private void button2_Click(object sender, EventArgs e)
    {
        if (dataGridView1.SelectedRows.Count < 1)
            return;

        int index = dataGridView1.SelectedRows[0].Index;
        int id = 0;
        bool converted = Int32.TryParse(dataGridView1[0, index].Value.ToString(), out id);
        if (converted == false)
            return;
 
        Player player = db.Players.Find(id);

        PlayerForm plForm = new PlayerForm();
		plForm.numericUpDown1.Value = player.Age;
        plForm.textBox1.Text = player.Name;

        // получаем список команд 
        List<Team> teams = db.Teams.ToList();
		plForm.listBox1.DataSource = teams;
        plForm.listBox1.ValueMember = "Id";
        plForm.listBox1.DisplayMember = "Name";
        foreach(Team t in player.Teams)
            plForm.listBox1.SelectedItem = t;
            
        DialogResult result = plForm.ShowDialog(this);
		if (result == DialogResult.Cancel)
            return;

        player.Age = (int)plForm.numericUpDown1.Value;
        player.Name = plForm.textBox1.Text;
            
        // проверяем наличие команд у игрока
        foreach (var team in teams)
        {
            if (plForm.listBox1.SelectedItems.Contains(team))
            {
                if (!player.Teams.Contains(team))
                    player.Teams.Add(team);
            }
            else
            {
                if (player.Teams.Contains(team))
                    player.Teams.Remove(team);
            }
        }
        db.Entry(player).State = EntityState.Modified;
        db.SaveChanges();
        MessageBox.Show("Информация обновлена");
    }

    // удаление
    private void button3_Click(object sender, EventArgs e)
    {
        if (dataGridView1.SelectedRows.Count < 1)
            return;

        int index = dataGridView1.SelectedRows[0].Index;
        int id = 0;
        bool converted = Int32.TryParse(dataGridView1[0, index].Value.ToString(), out id);
        if (converted == false)
            return;

        Player player = db.Players.Find(id);

        db.Players.Remove(player);
        db.SaveChanges();

        MessageBox.Show("Футболист удален");
    }

    // добавление новой команды
    private void button4_Click(object sender, EventArgs e)
    {
        TeamForm tmForm = new TeamForm();

        DialogResult result = tmForm.ShowDialog(this);
        if (result == DialogResult.Cancel)
            return;

        Team team = new Team();
        team.Name = tmForm.textBox1.Text;
        team.Coach = tmForm.textBox2.Text;
        team.Players = new List<Player>();

        db.Teams.Add(team);
        db.SaveChanges();
        MessageBox.Show("Новая команда добавлена");
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850