2012-01-12 30 views
7

Linq'den SQL öğesine klonlama gereksinimim var. genel olarak: CloneUtils.Clone() yeni varlığa orijinal varlıktan kopyaya veri kopyalamak için yansıma kullanan basit bir jenerik yöntemdirLinq'den Sql'ye klonlama Varlık - veri içeriğinin çıkarılması

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 

.

Ben sorun olduğunu ben denemek ve veritabanına geri yeni varlık eklerken, aşağıdaki hatayı alıyorum:

bir girişimde belki takın ya da yeni olmayan bir varlık ekleme için yapılmıştır

başka bir DataContext'ten yüklenmiş. Bu desteklenmiyor.

Klonlanmış varlığı veri bağlamından ayırmanın kolay/genel bir yolunu bulamıyorum. Ya da bağlam ile ilgili alanları 'atlamak' için klonlama yöntemimi ayarlayabilir miyim?

Beni doğru yöne yönlendiren var mı?

Teşekkürler.

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

cevap

6

Sadece kamu özelliklere değer türleridir

var PropertyBindings = BindingFlags.Public | BindingFlags.Instance; 

veya dize

var PropType = p.PropertyType.IsValueType || p.PropertyType == typeof(string); 

klon: Bütünlüğü için

, burada Marcus'un tavsiyesine aşağıdaki ile sona erdi yöntemdir Ve bu erişilebilir

var IsAccessible = p.CanRead && p.CanWrite; 
+0

Teşekkür ederim Marcus - bu mükemmel çalıştı – Neilski