Tôi đang cố gắng sao chép sâu/sao chép một mục thực thể chứa Trẻ em-Các mặt hàng cùng loại. Item cũng có các tham số, cũng cần được nhân bản. ItemType, tuy nhiên, nên được để lại như một tham chiếu đến ItemType hiện có.Entity Framework 6 bản sao sâu/bản sao của một thực thể có độ sâu động
Với sự giúp đỡ của Stackoverflow (Entity Framework 5 deep copy/clone of an entity) Tôi đã đưa ra những nỗ lực khá tệ hại sau:
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;
}
Đối với một độ sâu mức cố định của 3 nỗ lực này hoạt động như một sự quyến rũ. Tuy nhiên, như bạn có thể thấy, điều này là không nhận được khá tốt đẹp với mỗi cấp độ sâu hơn. Thiết kế cho phép số lượng lồng nhau vô hạn (Trong ngữ cảnh của tôi, tuy nhiên, không nên có nhiều hơn 5 cấp).
Có khả năng tự động thêm Bao gồm vào IQueryable tùy thuộc vào độ sâu tối đa không?
Đây là item thực thể nhân bản:
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; }
}