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

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

Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел рассказать о связи многие ко многим в Entity Framework. Изменений в коде будет минимум по сравнению с примером из предыдущей статьи. Изменения коснутся только класса Product, т.е. теперь один продукт может принадлежать нескольким заказам.

Скачать проект полностью можно по ссылке.

Класс Product:

using System.Collections.Generic;

namespace TestProject
{
  class Product
  {
    // id продукта
    public int Id { get; set; }
    // наименование продукта
    public string Name { get; set; }
    // цена продукта
    public int Price { get; set; }
    // Коллекция заказов
    public ICollection<Order> Order { get; set; }
  }
}

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

Посмотреть код:

Строка подключения к файлу App.config:

<connectionStrings>
  <add name="ManyToManyEF" connectionString="data source=(LocalDb)\v11.0;initial catalog=ManyToManyEF;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>

Класс Order:

using System.Collections.Generic;

namespace TestProject
{
  class Order
  {
    // id заказа
    public int Id { get; set; }
    // заказчик
    public string Customer { get; set; }

    // Коллекция продуктов
    public ICollection<Product> Product { get; set; }
  }
}

Класс ManyToManyEF:

using System.Data.Entity;

namespace TestProject
{
  class ManyToManyEF: DbContext
  {
    public ManyToManyEF(): base("name=ManyToManyEF")
    { }
    public virtual DbSet<Product> Products { get; set; }
    public virtual DbSet<Order> Orders { get; set; }

  }
}

Основной код:

using System;
using System.Linq;
using System.Data.Entity;
using System.Collections.Generic;

namespace TestProject
{
  class Program
  {
    static void Main(string[] args)
    {
      Database.SetInitializer(new DropCreateDatabaseAlways<ManyToManyEF>());

      using (ManyToManyEF db = new ManyToManyEF())
      {
        // Создаём 4 продукта
        Product book1 = new Product { Name = "C# Book", Price = 1500 };
        Product book2 = new Product { Name = "Java Book", Price = 1800 };
        Product book3 = new Product { Name = "PHP Book", Price = 1000 };
        Product book4 = new Product { Name = "Javascript Book", Price = 1200 };

        // Добавляем продукты в таблицу.
        db.Products.AddRange(new List<Product> { book1, book2, book3, book4 });
        // Сохраняем продукты в базе данных
        db.SaveChanges();

        //Создаём 2 заказа
        Order order1 = new Order { Customer = "Alex", Product = new List<Product> { book1, book2 } };
        Order order2 = new Order { Customer = "Ivan", Product = new List<Product> { book1, book2, book3, book4 } };
        // Добавляем заказы в таблицу.
        db.Orders.AddRange(new List<Order> { order1, order2 });

        db.SaveChanges();

        //Выбираем из БД все наши заказы
        var orders = db.Orders.ToList();

        //Выводим их в консоль
        foreach (Order order in orders)
        {
          Console.WriteLine("Заказчик {0} приобрел следующие товары: ", order.Customer);
          int sum = 0;
          foreach (Product product in order.Product)
          {
            Console.WriteLine("{0}, цена: {1}", product.Name, product.Price);
            sum += product.Price;
          }
          Console.WriteLine("Всего заказов на сумму {0} руб.", sum);
          // Отступ между заказами
          Console.WriteLine("---------------------");
        }
      }

      Console.WriteLine("Нажмите клавишу для продолжения...");
      Console.ReadLine();
    }
  }
}

Если мы подключимся к нашей локальной базе данных, то увидим что было создано 3 таблицы, а не 2, как в предыдущих примерах. При связи многие ко многим создаётся дополнительная таблица, которая id продукту соотносит id заказа. Сама таблица:

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

Таблица Orders:

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

Таблица Products:

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

Результат выполнения программы:

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

В данной статье вы познакомились со связью многие ко многим в Entity Framework.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *