使用EF从两个数据库之间复制记录

时间:2011-08-03 10:25:36

标签: entity-framework

我需要使用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属性。”

你能帮忙实施吗?

3 个答案:

答案 0 :(得分:4)

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

  1. 致电context.Detach(form)
  2. 将表单的EntityKey设置为null
  3. 致电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选项。这样你就不需要分离它们,这就是导致问题的原因。

Entity Framework - Detach and keep related object graph

答案 2 :(得分:1)

如果您只做一些记录,Ladislav的建议可能会有效,但如果您要移动大量数据,您应该/可以考虑在存储过程中执行此操作。整个操作可以在服务器上完成,无需将对象从数据库服务器移动到前端,然后再移回。单个SP呼叫可以完成所有操作。

表现会好很多,在你的情况下可能会或可能不重要。