2010-10-14 17 views
1

J'utilise EF4 et j'ai créé des objets POCO avec des proxies à partir de ma structure de base de données. J'ai un POCO (objet) qui a beaucoup de relations avec d'autres entités.Comment cloner l'entité POCO et ajouter au contexte

J'ai créé une copie complète de l'objet en utilisant DataContractSerializer et BinaryFormatter et l'appelons clonedObject.

fonction

utilisé pour le clonage est:

public T CloneProxy<T>(T source) 
{ 
    var dcs = new System.Runtime.Serialization 
    .DataContractSerializer(typeof(T)); 
    string filePath = "Initiative.txt"; 

    using (FileStream file = new FileStream(filePath, FileMode.Create)) 
    { 
    (new BinaryFormatter()).Serialize(file, source); 
    } 

    context.CreateProxyTypes(new Type[] { typeof(Initiative) }); 

    using (FileStream file = new FileStream(filePath, FileMode.Open)) 
    { 
    return (T)(new BinaryFormatter()).Deserialize(file); 
    } 

} 

Maintenant que j'ai clonedObject, comment puis-je ajouter au contexte? comment l'ajouter à la base de données?

mon objet (juste vous donner une idée de l'Initiative POCO):

Initiative 
{ 
InitI 
InitName  
<collection>Comments 
}  
Comments  
{  
CommentI  
<FK>InitI 
} 

Voici quelques-unes comme je l'ai fait et les erreurs que je l'ai reçu.

cloneInit.InitI = 0; 

    Data_Business.RQRMComment[] arr = new Data_Business.RQRMComment[1]; 

    arr = cloneInit.RQRMComments.ToArray(); 

    for (int x = 0; x < arr.Length; x++) //each (var x in cloneInit.RQRMComments) 
    { 
     RQRMComment thisC = arr[x]; 
     int y = thisC.InitI; 
     thisC.InitI = 0; 
     thisC.ID = 0; 
    } 
    Context.AddObject("Initiatives", cloneInit); 
    Context.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave); 

Erreur:

ex = {"The object could not be added or attached because its EntityReference has an EntityKey property value that does not match the EntityKey for this object."}

S'il vous plaît aider, je l'ai passé trop de temps à ce sujet. Je vous remercie.

+0

S'il vous plaît ne vont pas la route sérialisation, sauf si vous savez exactement ce que vous faites, par expérience, je sais que cela nécessite une tonnes de modifications à vous générer du code pour le faire fonctionner correctement. – leppie

Répondre

3

J'ai eu besoin de cloner mes Entités dans le but de ré-afficher les données sur un formulaire afin qu'un utilisateur puisse choisir de "Créer & Ajouter Similaire" afin de réduire la quantité d'effort dont un utilisateur a besoin dépenser afin d'ajouter une gamme d'articles similaires à ma base de données. Je ai vérifié quelques options, y compris la réflexion & sérialisation, mais ils sont en désordre pour ce que je cherche à réaliser, j'ai alors découvert que je peux surmonter le problème "XYZ fait partie de l'information de l'objet et ne peut pas être modifié" - à-dire mis mes entités clé primaire à 0 après insertion (Save Changes) - avec le code suivant:

MyDbEntities bb = new MyDbEntities(); 

//Add & Save new entry 
db.Product.AddObject(product); 
db.SaveChanges(); 

//Reset entity 
db.ObjectStateManager.ChangeObjectState(product, System.Data.EntityState.Added); 
product.ProductId = 0;