Связь многие ко многим 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 заказа. Сама таблица:

Таблица Orders:

Таблица Products:

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

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




