Dato due database di schema identico, esiste un modo semplice per trasferire i record tra i due? Sto usando LINQ to SQL in quanto ho bisogno di eseguire alcune operazioni aggiuntive lungo la strada e avere oggetti che rappresentano i record che sto trasferendo rende molto più facile. Questa è un'app helper su piccola scala, quindi SSIS è probabilmente eccessivo e SQLBulkCopy non mi consente di interrogare facilmente gli oggetti lungo il percorso.Utilizzo di LINQ to SQL per la copia tra database
Quello che mi piacerebbe fare è questo:
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();
}
}
Ma per ovvie ragioni, che genera un'eccezione con il messaggio:
Un tentativo è stato fatto per Allega o Aggiungi un entità che non è nuova, forse essendo stata caricata da un altro DataContext. Questo non è supportato.
posso ottenere tutto questo facendo una copia dell'oggetto in questo modo:
public static Customer Clone(this Customer customer)
{
return new Customer()
{
Name = customer.Name,
Email = customer.Email
etc...
};
}
e quindi inserendo l'oggetto clonato. Se copio solo i campi in questione, e non tutti i riferimenti che rappresentano le relazioni tra tabelle, questo funziona correttamente. Tuttavia è un po 'prolisso e il modo in cui sto facendo ha bisogno di assegnare manualmente ogni campo nel metodo Clone. Qualcuno potrebbe suggerire modi per semplificare questo processo? Le due cose che mi piacerebbe sapere è:
- Può LINQ to SQL fare questo in un modo più semplice,
- C'è un bel modo di utilizzare la riflessione per fare una copia che inserire?
Grazie mille!
Questo è vero, ma è solo un'applicazione aiutante leggero per me da usare. Non prevedo il trasferimento di più di 50 righe su più tabelle in ogni batch, quindi penso che SSIS sia probabilmente eccessivo. La mia attuale soluzione che utilizza un metodo clone per oggetto funziona molto bene, ma sembra poco elegante. Ho bisogno di aggiungere altri tavoli, quindi ho voluto trovare un modo migliore prima di scrivere più metodi di clonazione! –