2011-02-23 41 views
2

如何将客户从CRM数据库复制到另一个CRM数据库?使用c#和实体框架将一组记录从一个sql服务器复制到另一个记录

我的要求是,从(生产)SQL服务器,我需要能够选择一个客户,并将他的相关数据的100%复制到另一个(测试)SQL服务器。

我已经有了一个实体模型,用于我的web应用程序,我希望使用相同的方式并将所有客户信息作为实体读取。但我不确定,我应该如何使用这些实体并连接到另一个sql服务器(我计划使用自定义配置来了解目标sql-server的地址)。

任何想法?

+0

为什么不创建原始数据库的备份并在另一个上重新创建它? – Maciek 2011-02-23 06:23:50

+0

@Maciek:我的客户关系管理系统的生产规模为40+ GB,因此这个想法毫无疑问。 – Nauman 2011-02-23 06:26:28

+0

如何在一个存储过程中执行此操作,并将参数作为目标数据库和服务器的名称?我宁愿在sql server端(存储过程)中这样做,因为无论何时更改db模式,sp都会失败或不再编译,并且将更容易找出原因。 – 2011-02-23 07:17:56

回答

2

您可以为您的客户和您想要传输的所有相关实体定义实体模型。接下来,您必须在测试服务器上定义完全相同的数据库结构,以便实体模型可用于两台服务器。

的基本情况可以(伪):

Customer customer = null; 
using (var context = new MyContext("ProductionConnectionString")) 
{ 
    // You must use Include to load all related data 
    customer = context.Customers.Include("...").Where(...).Single(); 
} 

using (var context= new MyContext("TestConnectionString")) 
{ 
    context.Customers.AddObject(customer); // Inserts everything 
    using (var scope = new TransactionScope()) 
    { 
    context.SaveChanges(); 
    scope.Complete(); 
    } 
} 

的问题将是,如果数据的一部分,在DB已经存在。在这种情况下,您必须首先从测试数据库加载客户,并手动将生产客户的数据合并到已加载的数据中,以便现有数据不会再次插入,并且修改/删​​除的数据会在测试数据库中更新/删除。

+0

谢谢,您提供的伪代码正是我想通过交换连接实例化新上下文的内容。并且您试图预测目标数据库中部分数据的问题应该/不会发生,因为我打算将生产中的客户添加为新客户进行测试。当然,正如你所说的,db中的模式应该是相同的,为了解决这个问题,我已经在我的数据库中使用了一个版本管理系统,我打算在启动客户副本之前对其进行验证。 – Nauman 2011-02-23 10:53:43

+0

你也可以评论两种方法的优雅和表现吗?就像在使用一个存储过程和使用C#&EF的过程一样?不知道由于某种原因,我个人觉得基于C#和EF的解决方案会给我更多的控制和错误处理和可恢复性? – Nauman 2011-02-23 11:00:13

相关问题