2011-08-03 36 views
3

我需要使用EF将数据从一个数据库复制到另一个数据库。例如。我有以下表关系:Forms-> FormVersions-> FormLayouts ...我们在两个数据库中都有不同的表单,我们希望将它们收集到一个数据库中。基本上我想从一个数据库递归加载Form对象,并将其保存到另一个数据库中,并带有所有引用。另外,如果在第二个数据库中存在具有相同ID的对象,我还需要更改对象和相关对象的ID。使用EF从两个数据库之间复制记录

到现在为止我有以下代码:

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只能设置”

你能帮助实施吗?

回答

4

最简单的解决方案是创建窗体(新对象)的副本并添加新对象。否则,你可以尝试:

  1. 呼叫context.Detach(form)
  2. 设置窗体的EntityKey为null
  3. 呼叫context1.AddObject(form)
+0

我试过你的解决方案。它工作正常,但只适用于Form对象。当我分离窗体时,我会丢失所有相关的对象。所以如果Form有10个FormVersions并且我做了分离,Form就有0个FormVersions。我想实现复制所有层次结构,而不仅仅是根对象。 – zosim

+1

是的,它正是发生了什么,没有解决方案,除了创建窗体及其所有关系的完整副本(最简单的解决方案是序列化和反序列化窗体以获得完整的克隆 - 但窗体必须可序列化)。 –

+0

谢谢。序列化对我来说是一个解决方案。但是在用于生成EF模型的默认模板中,实体集合有[XmlIgnoreAttribute()]属性。它意味着相关对象不会被序列化。有没有任何选项如何序列化相关对象而无需修改模板? – zosim

1

如果你只是做一些记录,拉吉斯拉夫的建议可能会工作,但如果你正在移动大量数据,您应该/可以考虑在存储过程中执行此操作。整个操作可以在服务器上完成,无需将对象从数据库服务器移动到前端,然后再移回。一次SP呼叫就可以做到这一切。

性能会好很多,这可能或可能不会影响你的情况。

+0

感谢您的回复。在这种情况下,性能对我来说并不重要。更重要的是我想复制的相关表格的一个大层次结构。例如,我在我的帖子中只写了三个表格,但有近20个表格:Forms-> FormVersions-> FormLayouts-> LayoutRows-> LayoutColumns - > .... n。我可以在存储过程中完成,但我需要手动遍历所有相关的表。我发现EF是否能为我做到这一点。 – zosim

3

我会第一个第二个E.J.的答案。假设你将要使用实体框架,你将面临的主要问题领域之一是关系管理。您的代码应该使用Include方法来确保相关对象包含在选择操作的结果中。您拥有的连接不会产生这种效果。

http://msdn.microsoft.com/en-us/library/bb738708.aspx

此外,分离的物体将不会自动分离相关的对象。你可以用同样的方式分离它们,但是这里的问题是,当每个对象被分离时,它保持在上下文中的其他对象之间的关系被打破。

手动恢复关系可能是您的一个选择,但它可能值得一看EntityGraph。这个框架允许你定义对象图,然后执行诸如分离它们的操作。整个图形在一次操作中分离,其关系完好无损。

我对这个框架的使用经验与RIA服务和Silverlight有关,但我相信这些操作在.Net中也是支持的。

http://riaservicescontrib.codeplex.com/wikipage?title=EntityGraphs

EDIT1:我刚才检查的EntityGraph文档,看到DetachEntityGraph是不幸的规则它作为一个选择的RIA特定层。

编辑2:Alex Jame对以下问题的回答是解决您的问题的方法。不要将对象加载到上下文中 - 使用Notracking选项。这样你就不需要将它们分开,这就是导致问题的原因。

Entity Framework - Detach and keep related object graph

+0

感谢文章。现在我已经通过使用Ladislav的解决方案解决了我的问题。 – zosim

相关问题