首页 > 解决方案 > 对象的成员列表未在 .NET Core API 控制器中复制

问题描述

背景资料:

我的asp.net 核心 Web 应用程序(C#) 允许用户编辑一些提供的对象以满足他们自己的需要。我们显然不能让他们编辑主副本,所以我们为他们制作对象的克隆,然后他们编辑克隆。这些对象包含一些成员列表嵌套(彼此的列表),以及其他各种列表。为了简单起见,为了 NDA 等,我删除了一些细节。如果您需要更多信息,我将尽我所能。谢谢您的帮助!

对象的相关细节如下所示:

public class ObjectA
{
    public int Id { get; set; }
  
    public string Name { get; set; }

    public virtual List<ObjectB> objectBs{ get; set; }

    public virtual List<Standard> Standards { get; set; }

    public virtual List<Practice> Practices { get; set; }
}

其中 ObjectB 看起来像这样:

public class ObjectB
{
    public int Id { get; set; }
    
    public string Name { get; set; }
    
    public virtual List<ObjectC> objectCs { get; set; }
    
    public virtual List<Standard> Standards { get; set; }
    
    public virtual List<Practice> Practices { get; set; } 
}

最后,ObjectC 看起来像这样:

public class ObjectC
{
    public int Id { get; set; }
    
    public string Name { get; set; }
    
    public virtual List<Standard> Standards { get; set; }
    
    public virtual List<Practice> Practices { get; set; } 
}


我做过的问题和事情:

为了克隆对象,我使用类似于以下控制器方法的方法,其中 id 是您希望克隆的对象的 db id:

public IHttpActionResult CloneObjectA(int id)
{
    ObjectA clone = db.ObjectAs.Find(id);
    clone.Name+= " [CLONE]";
    List<ObjectB> objBs = clone.ObjectBs.ToList();
    //Need to reference these otherwise they dont carry over?
    _ = clone.Practices;
    _ = clone.Standards;
    db.ObjectAs.Add(clone);
    for (int i = 0; i < objBs.Count; i++)
    {
        ObjectB b = objBs[i];
        List<ObjectC> objCs = b.ObjectCs;
        //Need to reference these otherwise they dont carry over?
        _ = b.Practices;
        _ = b.Standards;
        db.ObjectBs.Add(b);
        for (int j = 0; j < objCs.Count; j++)
        {
            ObjectC c = objCs[j];
            //Need to reference these otherwise they dont carry over?
            _ = obj.Practices;
            _ = obj.Standards;
            db.ObjectCs.Add(c);
        }
    }
    db.SaveChanges();
    return StatusCode(HttpStatusCode.NoContent);
}

因此,正如您所注意到的,我在每个项目中都有看似毫无意义的陈述(由注释表示)丢弃了对每个列表的引用。如果没有这些列表,对象的克隆将包含 ObjB 和 ObjC 数组,但根本包括标准或实践数组(或为简单起见而删减的任何其他类似数组)。但是,一旦我将这些看似毫无意义的列表引用放入其中,这些值就会突然出现。为什么是这样?


问题:

  1. 为什么这些列表不会被复制,除非它们被引用?

  2. 有没有更好的方法来复制这些对象?

    2a. 这些对象都相当大(我删掉了很多成员变量),所以我想尽可能避免使用大型手动复制构造函数

    2b。我需要一个深拷贝,这样它就不会引用原件,并且不会相互影响。

    2c。我会单独发布每个部分,然后将它们连接起来,但这需要大量的数据库点击。

标签: c#databaseasp.net-corecloneasp.net-apicontroller

解决方案


推荐阅读