前言
我知道这可能已经被认为是一个疯狂的问题,但我正在寻找有关如何继续将所有数据(即所有实体和关系)从一个复制到新创建的支持的最受过教育的建议和经过验证的建议。 . 请参阅实体框架中的“克隆”EntityConnections 和 ObjectContexts 以了解我是如何设置它的。ObjectContext
ObjectContext
介绍
我在 Entity Framework 上看到了 Cloning data,但是:
我正在寻找整个 enchilada,即整个对象图:所有实体和关系。稍后,我将对对象图的哪些部分进行更细粒度的选择)
根据我下面的更新,我没有使序列化工作,但仅在特殊情况下。我觉得这真的是一个不那么复杂的任务,但它具有惊人的挑战性。我绝对需要一些关于如何使它工作的见解。
步骤1
好的,这是我到目前为止所尝试的。
我知道,当我使用Detach
/ Attach
power duo 时,关系是有限的——<strong>我实际上想要保留整个对象图。
因此,我正在考虑使用以下选项加载根实体MergeOption.NoTracking
:
var serializer = new DataContractSerializer(typeof(Root));
var query = (ObjectQuery<Root>) sourceContext.Roots
.Include(d => d.Children.Select(c => c.MoreChildren.Select(r => r.EvenMoreChildren)))
.Include(d => d.Children.Select(c => c.MoreChildren.Select(r => r.MoreAndMoreChildren)))
.Include(d => d.Children.Select(c => c.MoreChildren.Select(r => r.Shizzle)));
foreach (var d in query.Execute(MergeOption.NoTracking)) {
//sourceContext.Detach(d); // not needed
Print(d);
using (var ios = new MemoryStream()) {
serializer.WriteObject(ios, d);
ios.Seek(0, SeekOrigin.Begin);
var dd = (Root) serializer.ReadObject(ios);
//Console.WriteLine(string.Join(",", dd.EntityKey.EntityKeyValues.Select(k => k.Key + "=" + k.Value)));
targetContext.Roots.AddObject(dd);
}
}
鉴于我将实体加载为非跟踪,我不再需要调用sourceContext.Detach(d)
。
该Print
方法只是打印子对象树,它表明到目前为止一切进展顺利(我不会在这里展示它,因为它很大且无关紧要)。
然而,现在整个事情正在吹@serializer.WriteObject(ios, d)
以下消息:
“当使用合并选项返回对象时,只有在或不包含对象NoTracking
时才能调用 Load 。”EntityCollection
EntityReference
(这有点道理,因为序列化程序可能正在尝试延迟加载相关实体。)
请记住,如果我不使用NoTracking
,我必须分离实体,但我会失去我的关系......
第2步
当然,我sourceContext.ContextOptions.LazyLoadingEnabled = false
在执行序列化循环之前尝试过设置,并且修复了上面的错误,但这会导致臭名昭著:
“无法添加或附加该对象,因为它EntityReference
的EntityKey
属性值与该对象的不匹配EntityKey
。”
另外,请记住我仍然无法取消注释,sourceContext.Detach(d)
因为我加载了根NoTracking
...
第 3 步
我已经尝试EntityKey = null
在克隆实体上设置序列化之前甚至反序列化之后......都无济于事:
sourceContext.ContextOptions.LazyLoadingEnabled = false;
foreach (var d in query.Execute(MergeOption.NoTracking)) {
//sourceContext.Detach(d);
Print(d);
d.EntityKey = null;
using (var ios = new MemoryStream()) {
serializer.WriteObject(ios, d);
ios.Seek(0, SeekOrigin.Begin);
var dd = (Root) serializer.ReadObject(ios);
if (dd.EntityKey != null) {
Console.WriteLine("Deserialized EntityKey: {0}", string.Join(",", dd.EntityKey.EntityKeyValues.Select(k => k.Key + "=" + k.Value)));
dd.EntityKey = null;
}
targetContext.Roots.AddObject(dd);
}
}
可疑的是,我什至不知道上面所说的例外是什么该死的“对象”。
我真的,真的,真的,真的注定要尝试用纯粹的 EF 方法来解决这个问题吗???
我完全注定了?!?!?!:(