c# – Entity Framework 6深度复制/克隆具有动态深度的实体
发布时间:2020-12-15 07:52:33 所属栏目:百科 来源:网络整理
导读:我正在尝试深度克隆/复制包含相同类型的子项目的实体项目. Item也有参数,也应该克隆.但是,ItemType应保留为对现有ItemType的引用. 插图图: 在Stackoverflow(Entity Framework 5 deep copy/clone of an entity)的帮助下,我提出了以下相当糟糕的尝试: public
我正在尝试深度克隆/复制包含相同类型的子项目的实体项目. Item也有参数,也应该克隆.但是,ItemType应保留为对现有ItemType的引用.
插图图: 在Stackoverflow(Entity Framework 5 deep copy/clone of an entity)的帮助下,我提出了以下相当糟糕的尝试: 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,这种尝试就像一个魅力.但是,正如您所看到的,对于每个更深层次而言,这并不是很好.该设计允许无限数量的嵌套(但在我的上下文中,不应超过5个级别). 是否有可能根据最大深度动态添加包含到IQueryable? 这是要克隆的Item-entity: 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; } } 解决方法
我找到了一个更通用的方法来解决这个问题.
对于任何可能遇到类似问题的人,以下是我现在解决的问题: public Item DeepCloneItem(Item item) { Item itemClone = db.Items.FirstOrDefault(i => i.ItemID == item.ItemID); deepClone(itemClone); db.SaveChanges(); return itemClone; } private void deepClone(Item itemClone) { foreach (Item child in itemClone.ChildrenItems) { deepClone(child); } foreach(Parameter param in itemClone.Parameters) { db.Entry(param).State = EntityState.Added; } db.Entry(itemClone).State = EntityState.Added; } 请记住,递归调用必须在EntityState.Added分配之前.另外,递归将停在第二级. 如果实体树非常深,请考虑使用迭代方法替换递归.有关更多信息,请查看:Wikipedia Recursion versus iteration 欢迎提供反馈和改进! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |