同じタイプの子アイテムを含むエンティティアイテムを詳細に複製/コピーしようとしています。 Itemにはパラメータもあり、これも複製する必要があります。ただし、ItemTypeは既存のItemTypeへの参照として残す必要があります。イラスト用Entity Framework 6動的な深さを持つエンティティのディープコピー/クローン
図:
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;
}
3この試みの一定の深さレベルの場合:StackOverflowのの助けを借りて
は(Entity Framework 5 deep copy/clone of an entityは)私は、次のかなりお粗末な試みが出ています魅力のように働く。しかし、あなたが見るように、これはそれぞれのより深いレベルではうまくいきません。このデザインでは、無制限のネストが可能です(ただし、私の考えでは5レベル以上は許されません)。
最大深度に応じてIQueryableにインクルードを動的に追加する可能性はありますか?
これは、クローン化するアイテムのエンティティである:
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; }
}