我想使用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(_);
});
问题解决了。