使用LINQ to SQL在数据库之间进行复制

Jon*_*tus 9 c# linq-to-sql

鉴于两个相同模式的数据库,有没有简单的方法在两者之间传输记录?我正在使用LINQ to SQL,因为我需要在此过程中执行一些额外的操作,并且使用表示我正在传输的记录的对象使这更容易.这是一个小规模的帮助应用程序,因此SSIS可能有点过分,SQLBulkCopy不允许我在途中轻松查询对象.

我想做的是:

public static void TransferCustomer
                     (DBDataContext DCSource, 
                      DBDataContext DCDest, 
                      int CustomerID)
{
  Customer customer;
  using (DCSource = new DBDataContext(SourceConnStr))
  {
    customer = DCSource.Customers
                       .Where(c => c.CustomerID == CustomerID)
                       .Single();
  }

  using (DCDest = new DBDataContext(DestConnStr))
  {
    DCDest.Customers.InsertOnSubmit(customer);
    DCDest.SubmitChanges();
  }
}
Run Code Online (Sandbox Code Playgroud)

但是由于显而易见的原因,这会引发消息异常:

已尝试附加或添加非新的实体,可能已从另一个DataContext加载.这不受支持.

我可以通过像这样对象的浅拷贝来解决这个问题:

public static Customer Clone(this Customer customer)
{
  return new Customer()
  {
    Name = customer.Name,
    Email = customer.Email
    etc...
  };
}
Run Code Online (Sandbox Code Playgroud)

然后插入克隆的项目.如果我只复制有问题的字段,而不是任何表示表关系的引用,这可以正常工作.然而,它有点啰嗦,我正在做的方式需要我手动分配克隆方法中的每个字段.任何人都可以建议任何使这更容易的方法吗?我想知道的两件事是:

  1. LINQ to SQL能否以更简单的方式执行此操作,
  2. 有没有一种很好的方法可以使用Reflection来制作一个可以插入的浅拷贝?

非常感谢!

Kev*_*ter 0

这纯粹是一种学术活动吗?

如果不是,我会认真考虑使用 Microsoft SSIS: http: //msdn.microsoft.com/en-us/library/ms141026.aspx,或者失败的 Rhino ETL:http://ayende.com/Blog/archive/ 2008/01/16/Rhino-ETL-2.0.aspx用于在数据库之间传输数据。[链接文本][1]

  • 这是真实的,但它只是一个供我使用的轻量级帮助应用程序。我预计不会在每个批次中跨多个表传输超过 50 行,因此我认为 SSIS 可能有点矫枉过正。我当前的解决方案使用每个对象的克隆方法,效果非常好,但感觉不优雅。我需要添加更多表,因此我想在编写更多克隆方法之前找到更好的方法! (2认同)