Ho un requisito per clonare un'entità Linq a SQL. In visione:Clonazione di un entità Linq a Sql - distacco contesto dati
Customer origCustomer = db.Customers.SingleOrDefault(c => c.CustomerId == 5);
Customer newCustomer = CloneUtils.Clone(origCustomer);
newCustomer.CustomerId = 0; // Clear key
db.Customers.InsertOnSubmit(newCustomer);
db.SubmitChanges(); // throws an error
dove CloneUtils.Clone() è un semplice metodo generico che utilizza la riflessione per copiare la copia dei dati dal soggetto originale alla nuova entità.
Il problema che ho è che quando provo e aggiungi la nuova entità nel database, ottengo il seguente errore:
Un tentativo è stato fatto per Allega o Aggiungi un ente che non è nuovo, forse essendo stato caricato da un altro DataContext. Questo non è supportato.
Non riesco a trovare un modo facile/generico di scollegare l'entità clonata dal contesto dei dati. O forse posso regolare il mio metodo di clonazione per "saltare" i campi relativi al contesto?
Qualcuno può indicarmi la giusta direzione?
Grazie.
Per completezza, ecco il metodo che ho finito con seguendo il consiglio di Marcus:
public static T ShallowClone<T>(T srcObject) where T : class, new()
{
// Get the object type
Type objectType = typeof(T);
// Get the public properties of the object
PropertyInfo[] propInfo = srcObject.GetType()
.GetProperties(
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.Public
);
// Create a new object
T newObject = new T();
// Loop through all the properties and copy the information
// from the source object to the new instance
foreach (PropertyInfo p in propInfo)
{
Type t = p.PropertyType;
if ((t.IsValueType || t == typeof(string)) && (p.CanRead) && (p.CanWrite))
{
p.SetValue(newObject, p.GetValue(srcObject, null), null);
}
}
// Return the cloned object.
return newObject;
}
Grazie Marcus - ha funzionato perfettamente – Neilski