c# - 对象的成员列表未在 .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 数组,但根本不包括标准或实践数组(或为简单起见而删减的任何其他类似数组)。但是,一旦我将这些看似毫无意义的列表引用放入其中,这些值就会突然出现。为什么是这样?
问题:
为什么这些列表不会被复制,除非它们被引用?
有没有更好的方法来复制这些对象?
2a. 这些对象都相当大(我删掉了很多成员变量),所以我想尽可能避免使用大型手动复制构造函数
2b。我需要一个深拷贝,这样它就不会引用原件,并且不会相互影响。
2c。我会单独发布每个部分,然后将它们连接起来,但这需要大量的数据库点击。
解决方案
推荐阅读
- python - 评估图像分割方法
- javascript - 可选用 jsdoc、typescript checkjs (javascript) 反应 useState 类型
- python - 在未捕获数据的情况下,将具有 0 值的周添加到具有时间序列数据的 pandas 数据帧中的周
- vue.js - 通过 props 将数据从父组件传递到子组件时,数据在子组件的挂载钩子中似乎未定义
- python - 如何获取有关上述用户的信息(discord.py bot)?
- r - 通过取它们的最小值来合并具有相同名称的列
- sql - 带条件动作的 sqlite 表达式
- mongodb - MongoDB聚合:嵌套数组中的“填充”(解析)参考
- c# - 如何从浏览器拖动的链接中获取 URL 和标题
- html - Segoe UI 行高关闭?