【问题标题】:Copy a set of records from one sql-server to another using c# and entity framework使用 c# 和实体框架将一组记录从一个 sql-server 复制到另一个
【发布时间】:2011-02-23 21:43:26
【问题描述】:

如何将客户从 CRM 数据库复制到另一个 CRM 数据库?

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

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

有什么想法吗?

【问题讨论】:

  • 为什么不创建原始数据库的备份并在另一个数据库上重新创建它?
  • @Maciek:我的 CRM 在生产中的大小是 40+ GB,所以这个想法是不可能的。
  • 在以目标数据库和服务器名称为参数的存储过程中执行此操作怎么样?我更喜欢在 sql server 端(存储过程)执行此操作,因为每当您更改 db 架构时,sp 都会失败或不再编译,并且更容易确定原因。
  • 我更喜欢创建从生产到测试数据库的服务器链接,然后使用存储的过程来执行传输。
  • @Davide & @yodaj:感谢您的意见。我保留了 sproc 选项作为最后的手段。但出于好奇,我仍然很想知道使用 C# 和 EF 实现这一壮举的可能性。

标签: c# sql-server-2008 entity-framework-4


【解决方案1】:

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

基本场景可以是(伪代码):

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();
  }
}

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

【讨论】:

  • 谢谢,您提供的伪代码正是我想用切换连接实例化新上下文的方法。并且您尝试预见的有关目标数据库中的部分数据的问题应该/不会发生,因为我打算将生产中的客户添加为测试中的新客户。当然,正如您正确地说,两个数据库中的架构应该相同,为了处理这个问题,我已经在我的数据库中遵循了一个版本控制系统,我打算在启动客户副本之前对其进行验证。
  • 您能否评论一下这两种方法的优雅和性能?就像使用存储过程和使用 C# 和 EF 的存储过程一样?不知道出于什么原因,我个人觉得基于 C# 和 EF 的解决方案会给我更多的控制以及错误处理和可恢复性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多