2012-01-12 25 views
7

मुझे एक लिंक को SQL इकाई में क्लोन करने की आवश्यकता है। सिंहावलोकन में:एसक्यूएल एंटिटी के लिए एक लिंक क्लोन करना - डेटा संदर्भ को अलग करना

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 

जहां CloneUtils.Clone() एक सरल सामान्य विधि प्रतिलिपि डेटा मूल इकाई से नई इकाई को कॉपी करने के लिए प्रतिबिंब का उपयोग करता है है।

समस्या मैं यह है कि जब मैं कोशिश करते हैं और नई इकाई डेटाबेस में वापस जोड़ने के लिए, मैं निम्नलिखित त्रुटि मिलती है:

का प्रयास संलग्न या इकाई नया नहीं है जोड़ें, शायद किया गया है एक और डेटाकॉन्टेक्स्ट से लोड किया गया है। यह समर्थित नहीं है।

मुझे डेटा संदर्भ से क्लोन इकाई को अलग करने का एक आसान/सामान्य तरीका प्रतीत नहीं होता है। या शायद मैं संदर्भ संबंधित क्षेत्रों को 'छोड़' करने के लिए अपने क्लोनिंग विधि को समायोजित कर सकता हूं?

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

धन्यवाद।

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

उत्तर

6

केवल सार्वजनिक गुण

var PropertyBindings = BindingFlags.Public | BindingFlags.Instance; 

मूल्य प्रकार के होते हैं कि या स्ट्रिंग

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

क्लोन:

पूर्णता के लिए, यहाँ विधि मैं मार्कस की सलाह निम्नलिखित के साथ समाप्त हो गया है और यह सुलभ हैं

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

धन्यवाद मार्कस - जो पूरी तरह से काम करता है – Neilski