2009-09-23 6 views
3

J'aimerais copier en profondeur une entité et je cherche la meilleure façon de le faire. Je suis également préoccupé par les performances.Clone (copie en profondeur) Entité LINQ

Je prévois d'avoir toutes mes entités implémentant ICloneable où Clone() va fondamentalement copier et cloner toutes les références.

Par exemple:

[DataContract()]  
class MyEntity { 
    public int id; 
    public string name;  
    public EntitySet<AnotherEntity> myOtherEntity; 
} 

MyEntity Clone() { 
Entity ent = new Entity(); 
ent.name = this.name; 
ent.myOtherEntity = this.myOtherEntity.Clone(); 
return ent; 
} 

Est-ce une bonne façon de le faire? Ou devrais-je charger l'entité avec linq, supprimer toutes les clés primaires (mettre l'ID à 0) et ensuite utiliser une fonction Créer (entité) pour le dupliquer? La réflexion pourrait-elle être une solution valable aussi (pas trop lente)? Au moins la réflexion peut éviter le problème lors de la mise à jour de ma classe d'entité (nouveaux membres par exemple) sans mettre à jour la fonction Clone ...

Répondre

0

IClonable n'est pas une solution mauvaise; il était, après tout, conçu à cet effet. Je ne suis pas sûr que je voudrais écrire une implémentation pour chaque type d'entité, mais vous pouvez contourner cela avec un générateur de code. Soyez prudent mais des références circulaires, cependant. Mais si vous vous souciez de la performance du tout lorsque vous faites cela, vous le faites probablement trop souvent. Si la performance est un problème ici, je voudrais savoir quel problème vous essayez réellement de résoudre.

+0

Je suppose que l'écriture d'un générateur de code pour cela pourrait être une bonne solution, au moins plus stable avec les autres développeurs dans l'équipe. –

+3

Avec EF v4, vous pouvez utiliser un gabarit de génération d'artefacts T4 personnalisé pour ce faire dans le cadre de la génération de modèle. –

+0

Je vais y jeter un coup d'oeil. Je vous remercie :) –

0

Vous pouvez essayer cette fonction:

private static object CloneObject(object obj) 
    { 
     Type cloneType = obj.GetType(); 

     object clone = Activator.CreateInstance(cloneType); 

     PropertyInfo[] properties = cloneType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty); 
     foreach (PropertyInfo property in properties) 
     { 
      if (property.CanWrite) 
      { 
       object value = property.GetValue(obj, null); 
       property.SetValue(clone, value, null); 
      } 
     } 

     return clone; 
    } 

Et

Entity newEnt = new Entity(); 
newEnt = (Entity)CloneObject(oldEnt); 
Questions connexes