Próbuję głęboko sklonować/skopiować obiekt Obiekt zawierający elementy dziecięce tego samego typu. Przedmiot ma również parametry, które również powinny zostać sklonowane. Element ItemType należy jednak pozostawić jako odniesienie do istniejącego ItemType.Struktura obiektu 6 głęboka kopia/klon podmiotu o dynamicznej głębokości
Z pomocą Stackoverflow (Entity Framework 5 deep copy/clone of an entity) I mają pochodzić z poniższego raczej kiepska próba:
public Item DeepCloneItem(Item item)
{
Item itemClone = db.Items //Level 1
.Include(i => i.ChildrenItems.Select(c => c.ChildrenItems)) //3 Levels
.Include(i => i.Parameters) //Level 1 Params
.Include(i => i.ChildrenItems.Select(c => c.Parameters)) //Level 2 Params
.Include(i => i.ChildrenItems.Select(c => c.ChildrenItems
.Select(cc => cc.Parameters))) //Level 3 Params
.AsNoTracking()
.FirstOrDefault(i => i.ItemID == item.ItemID);
db.Items.Add(itemClone);
db.SaveChanges();
return itemClone;
}
na ustaloną głębokość poziomie od 3 Ta próba działa jak marzenie. Jednak, jak widać, nie jest to całkiem niezłe z każdym głębszym poziomem. Konstrukcja pozwala na nieskończoną liczbę zagnieżdżeń (w moim kontekście jednak nie powinno być więcej niż 5 poziomów).
Czy istnieje możliwość dynamicznego dodawania opcji Includes do IQueryable w zależności od maksymalnej głębokości?
Jest to pozycja, jednostka sklonować:
public class Item
{
public int ItemID { get; set; }
public int? ParentItemID { get; set; }
[ForeignKey("ParentItemID")]
public virtual Item ParentItem { get; set; }
public virtual ICollection<Item> ChildrenItems { get; set; }
[InverseProperty("Item")]
public virtual ICollection<Parameter> Parameters { get; set; }
public ItemTypeIds ItemTypeID { get; set; }
[ForeignKey("ItemTypeID")]
public virtual ItemType ItemType { get; set; }
}