gpt4 book ai didi

c# - Entity Framework 6 深度复制/克隆具有动态深度的实体

转载 作者:太空狗 更新时间:2023-10-29 20:36:14 25 4
gpt4 key购买 nike

我正在尝试深度克隆/复制包含相同类型的子项目的实体项目。该项目也有参数,也应该被克隆。但是,ItemType 应该保留为对现有 ItemType 的引用。

说明图: enter image description here

在 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 层)。

是否有可能根据最大深度将 Includes 动态添加到 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; }
}

最佳答案

我找到了一个更通用的方法来解决这个问题。对于可能遇到类似问题的任何人,这是我现在的解决方法:

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

欢迎提供反馈和改进!

关于c# - Entity Framework 6 深度复制/克隆具有动态深度的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33875260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com