我需要使用EF将数据从一个数据库复制到另一个数据库。例如。我有以下表格关系:Forms-> FormVersions-> FormLayouts ...我们在两个数据库中都有不同的表单,我们希望将它们收集到一个数据库中。基本上我想从一个DB递归加载Form对象,并将其保存到另一个包含所有引用的DB。如果第二个数据库中存在具有相同ID的对象,我还需要更改对象和相关对象的ID。
到目前为止,我有以下代码:
Form form = null;
using (var context = new FormEntities())
{
form = (from f in context.Forms
join fv in context.FormVersions on f.ID equals fv.FormID
where f.ID == 56
select f).First();
}
var context1 = new FormEntities("name=FormEntities1");
context1.AddObject("Forms", form);
context1.SaveChanges();
我收到错误:“只有在属性的当前值为null时才能设置EntityKey属性。”
你能帮忙实施吗?
答案 0 :(得分:4)
最简单的解决方案是创建Form(新对象)的副本并添加该新对象。否则你可以尝试:
context.Detach(form)
EntityKey
设置为null context1.AddObject(form)
答案 1 :(得分:3)
我首先回答E.J.的回答。假设您将使用实体框架,您将面临的主要问题之一是关系管理。您的代码应使用Include方法来确保相关对象包含在select操作的结果中。你拥有的联接不会产生这种效果。
http://msdn.microsoft.com/en-us/library/bb738708.aspx
此外,分离对象不会自动分离相关对象。你可以用同样的方式分离它们,但是这里的问题是当每个对象被分离时,它与上下文中其他对象的关系就会被破坏。
手动恢复关系可能是您的选择,但是可能值得查看EntityGraph。此框架允许您定义对象图,然后执行分离操作。整个图表在一次操作中分离,其关系完好无损。
我对此框架的体验与RIA Services和Silverlight有关,但我相信.Net也支持这些操作。
http://riaservicescontrib.codeplex.com/wikipage?title=EntityGraphs
Edit1:我刚检查了EntityGraph文档,看到DetachEntityGraph在RIA特定层中,不幸的是将其作为一个选项进行规则。
Edit2:Alex Jame对以下问题的回答是解决您的问题。不要将对象加载到上下文中 - 使用notracking选项。这样你就不需要分离它们,这就是导致问题的原因。
答案 2 :(得分:1)
如果您只做一些记录,Ladislav的建议可能会有效,但如果您要移动大量数据,您应该/可以考虑在存储过程中执行此操作。整个操作可以在服务器上完成,无需将对象从数据库服务器移动到前端,然后再移回。单个SP呼叫可以完成所有操作。
表现会好很多,在你的情况下可能会或可能不重要。