.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克隆),但这是第二步。