实体框架 - 创建对象的副本并删除副本集合中的元素将删除原始和副本上的元素

时间:2018-04-12 15:36:04

标签: entity-framework collections many-to-many clone dbcontext

我想使用EF克隆从db上下文获取的对象。此类对象包含一个集合,而该集合又包含另一个集合。

对于对象的复制或克隆,我有一个创建新实例的方法,复制所有字段,最后将原始字段标记为EntityState.Unchaged。

Availability newAvailability = new Availability();
newAvailability = availabilityRepository.Copy(sourceAvailability, user);

newAvailability.RemoveTag(img, tagToRemove);

在这个例子中,我有一个包含一组图像的可用性,其中每个图像都可以有标签。我想要做的是创建可用性对象的克隆以及图像,然后使用连接表将标记关联到每个图像。

在下一步中,我想从复制的可用性中删除其中一个复制图像中的标记。

结果是两个阵列上的标签都被移除了。

奇怪的是,RemoveTag扩展方法根本不使用EF。它看起来像这样:

var filterExpression = new Func<Image, bool>(y => y.Url == img.Url));

var image = availability.Images.FirstOrDefault(filterExpression);
image.Tags.Remove(tag);
return availability;

现在,如果我有这样的可用性(假设这是连接表的结果,则可用性可以包含许多图像,而图像可以包含许多标记):

A = 1; Image = 1;标签= 6

然后当我创建它的副本时,它看起来像:

A = 2; Image = 2;标签= 6

结果应该是可用性中图像2中的标记6被删除,源可用性保持不变。但那不是正在发生的事情。

注意:Copy方法正在进行

this.context.Entry(availability).State = EntityState.Unchanged;

我可能做错了什么?我应该如何避免EF从源父级中删除此子对象?

提前致谢

编辑:

找到了解决方案,虽然我并不完全确定这样做会在内部发生什么变化。我写了

imgCopy.Tags = img.Tags;

但是当我改为

img.Tags.ToList().ForEach((_) =>
                {
                    imgCopy.Tags.Add(_);
                });
问题解决了。

0 个答案:

没有答案