代码之家  ›  专栏  ›  技术社区  ›  GustavoZafra

实体框架6克隆数据库中的父级和所有子级

  •  0
  • GustavoZafra  · 技术社区  · 8 年前

    我正在尝试复制一个对象(Parent)及其关系(Children1、Children 2、Childeren 3和Childrren4),为数据库中的每个对象创建一个新id,但仍然失败。有什么方法可以做到这一点吗?

    下面是对象的结构及其关系。拜托,我需要很多人来帮助我。

    public class Parent
    {
        [PrimaryKey]
        public long IdParent {get; set;}
        public string Description {get; set;}
        public string OtherValue {get; set;}
    
        public virtual ICollection<Children1> Childrens1 {get; set;}
    }
    
    public class Children1
    {
        [PrimaryKey]
        public long IdParent {get; set;}
        [PrimaryKey]
        public long IdChildren1 {get; set;}
        public string Description {get; set;}
    
        public virtual Parent Parent {get; set;}
        public virtual ICollection<Children1> Childrens1 {get; set;}
    }
    
    public class Children2
    {
        [PrimaryKey]
        public long IdParent {get; set;}
        [PrimaryKey]
        public long IdChildren1 {get; set;}
        [PrimaryKey]
        public long IdChildren2 {get; set;}
        public string Description {get; set;}
    
        public virtual Children1 Children1 {get; set;}
    }
    
    public class Children3
    {
        [PrimaryKey]
        public long IdParent {get; set;}
        [PrimaryKey]
        public long IdChildren1 {get; set;}
        [PrimaryKey]
        public long IdChildren3 {get; set;}
        public string Description {get; set;}
    
        public virtual Children1 Children1 {get; set;}
        public virtual ICollection<Children4> Childrens4 {get; set;}
    }
    
    public class Children3
    {
        [PrimaryKey]
        public long IdParent {get; set;}
        [PrimaryKey]
        public long IdChildren1 {get; set;}
        [PrimaryKey]
        public long IdChildren3 {get; set;}
        [PrimaryKey]
        public long IdChildren4 {get; set;}
        public string Description {get; set;}
    
        public virtual Children3 Children3 {get; set;}
    }
    

    enter image description here

    2 回复  |  直到 8 年前
        1
  •  1
  •   Cinchoo    8 年前

    这就是我处理这件事的方式。从上下文中检索所有父级子级,不进行跟踪,并将它们添加回上下文以进行克隆。

    (我只是展示了基于实体图的示例代码,因为实体模型类与之不匹配。)

    public Item DeepClone(Parent item)
    {
        Parent itemClone = db.Parents
            .Include(i => i.Childrens1.Select(c => c.Childrens2 ))
            .Include(i => i.Childrens3.Select(c => c.Childrens4 ))
            .AsNoTracking()
            .FirstOrDefault(i => i.IdParent == item.IdParent);
    
        db.Items.Add(itemClone);
        db.SaveChanges();
        return itemClone;
    }
    
        2
  •  0
  •   Riaz Raza    8 年前

    在这种情况下,最好的做法是从上下文中分离对象,然后重新插入,但这种方法的唯一问题是分离父对象不会分离相关对象,您必须显式分离所有相关对象,然后再重新插入它们以生成它们的克隆

    context.Detach(object);
    context.SaveChanges(object);
    context.Entry(object).State = EntityState.Added;
    context.SaveChanges();