Entity Framework Core
Aggiornamento di una relazione da molti a molti
Ricerca…
introduzione
Come aggiornare una relazione da molti a molti in EF Core:
MVC POST Modifica esempio
Supponiamo di avere una classe di prodotto con più colori che può essere su molti prodotti.
public class Product
{
public int ProductId { get; set; }
public ICollection<ColorProduct> ColorProducts { get; set; }
}
public class ColorProduct
{
public int ProductId { get; set; }
public int ColorId { get; set; }
public virtual Color Color { get; set; }
public virtual Product Product { get; set; }
}
public class Color
{
public int ColorId { get; set; }
public ICollection<ColorProduct> ColorProducts { get; set; }
}
Usando questa estensione per renderla più facile:
public static class Extensions
{
public static void TryUpdateManyToMany<T, TKey>(this DbContext db, IEnumerable<T> currentItems, IEnumerable<T> newItems, Func<T, TKey> getKey) where T : class
{
db.Set<T>().RemoveRange(currentItems.Except(newItems, getKey));
db.Set<T>().AddRange(newItems.Except(currentItems, getKey));
}
public static IEnumerable<T> Except<T, TKey>(this IEnumerable<T> items, IEnumerable<T> other, Func<T, TKey> getKeyFunc)
{
return items
.GroupJoin(other, getKeyFunc, getKeyFunc, (item, tempItems) => new { item, tempItems })
.SelectMany(t => t.tempItems.DefaultIfEmpty(), (t, temp) => new { t, temp })
.Where(t => ReferenceEquals(null, t.temp) || t.temp.Equals(default(T)))
.Select(t => t.t.item);
}
}
L'aggiornamento dei colori di un prodotto sarebbe simile a questo (un metodo POST di modifica MVC)
[HttpPost]
public IActionResult Edit(ProductVm vm)
{
if (ModelState.IsValid)
{
var model = db.Products
.Include(x => x.ColorProducts)
.FirstOrDefault(x => x.ProductId == vm.Product.ProductId);
db.TryUpdateManyToMany(model.ColorProducts, vm.ColorsSelected
.Select(x => new ColorProduct
{
ColorId = x,
ProductId = vm.Product.ProductId
}), x => x.ColorId);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(vm);
}
public class ProductVm
{
public Product Product { get; set; }
public IEnumerable<int> ColorsSelected { get; set; }
}
Il codice è stato semplificato il più possibile, senza proprietà aggiuntive su nessuna classe.
Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow