Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用EF6深度克隆实体_.net_Entity Framework_Entity Framework 6 - Fatal编程技术网

.net 使用EF6深度克隆实体

.net 使用EF6深度克隆实体,.net,entity-framework,entity-framework-6,.net,Entity Framework,Entity Framework 6,我已经对此进行了大量研究,但仍然没有找到克隆实体并能够保存实体的解决方案,包括所有级别的子关系 有人知道怎么做吗 顺便说一句,我使用AsNoTracking()然后使用Include(“Child…”)实现了这一点,但我的数据库中有5个级别的关系,大约有100个表需要包含,所以我在寻找一种自动实现这一点的方法,我尝试了3种不同的方法,包括序列化(由于延迟加载,在大多数情况下不可用),在具有反射的基本实体上实现iClonable,并使用自定义属性控制克隆行为(我认为您正在寻找这一点),在每个实体上

我已经对此进行了大量研究,但仍然没有找到克隆实体并能够保存实体的解决方案,包括所有级别的子关系

有人知道怎么做吗


顺便说一句,我使用AsNoTracking()然后使用Include(“Child…”)实现了这一点,但我的数据库中有5个级别的关系,大约有100个表需要包含,所以我在寻找一种自动实现这一点的方法,我尝试了3种不同的方法,包括序列化(由于延迟加载,在大多数情况下不可用),在具有反射的基本实体上实现iClonable,并使用自定义属性控制克隆行为(我认为您正在寻找这一点),在每个实体上实现iClonable

实际上,我在每个实体上都实现了iClonable。通常我会这样做:
1.MemberwiseClone()
2.调用相关实体的iClonable.Clone以填充属性(仅在某些属性上
3.在一些其他相关实体上,我制作了一份浅拷贝(取决于需要)

我知道这很糟糕,但根据我的经验,如果我在项目开始时使用其他方法,克隆工作正常,但在对某些实体调用克隆6个月后,克隆数据库的一半

在您的情况下,当惰性负载激活时,您可以使用反射。
1.忽略简单属性
2.为每个复杂属性调用克隆
3.对每个ICollection属性执行foreach,调用Clone并将结果添加到相应的列表中

这种方法的问题是每次都要克隆整个数据库。您可以决定在某些实体上停止覆盖克隆或在属性上使用自定义属性,但您需要避免克隆整个数据库

如果不激活延迟加载,则可以在克隆之前调用以下方法

context.Entry(myEntry).Reference("myRefProp").Load(); 
context.Entry(myEntry).Collection("myColl").Load(); 
但是他们不能解决你的问题

编辑
我仍然有应用这个方法的代码(带有属性),我很久没有使用它了,但是如果你需要的话,我可以把它发布到某个地方。
实际上,我总是在每个实体上实现iClonable,因为在克隆实现中使用属性停止序列化或停止序列化会更好。

我想你会在这里找到答案:他们在回答中使用AsNoTracking是的,但解释了在什么条件下可以安全地使用它+参见final行。这是一个答案还是一个补充问题?如果是后者:那么你应该将此添加到你的问题中。问题是你不清楚你在追求什么。一方面你似乎必须克隆100个表,另一方面你不想“每次都克隆整个数据库”。用例是什么?答案可能在字里行间。当你深度克隆一个对象树时,你必须选择如何独立于技术停止。然后你可以选择如何应用它(实际上我在使用不同的方法后在每个实体上实现了IClonable克隆),但这是第二步。