2010-04-23 3 views
2

J'ai une entité de projet avec plusieurs tables enfants, par exemple ProjectAwards ProjectTeamMemberPrendre un instantané (clonage) d'un projet utilisant Linq 2 Sql

Je voudrais copier les données du projet (et les tables de l'enfant) dans une nouvelle Enregistrement du projet et mise à jour du statut du projet.

par exemple

var projectEntity = getProjectEntity(projectId); 

draftProjectEntity = projectEntity 
draftProjectEntity.Status = NewStatus 

context.SubmitChanges(); 

J'ai trouvé ce lien from Marc Gravell

Sa partie du chemin, mais il met à jour les dossiers des enfants à la nouvelle draftProject, où je besoin de copier.

Répondre

1

Malheureusement, ce que vous faites ici est de régler la variable draftProjectEntity à une référence à l'objet projectEntity. Autrement dit, ils pointent maintenant vers le même objet. Ce que vous devez faire est un clone profond de projectEntity.

There are ways of doing this with Reflection - si vous allez faire beaucoup de choses - alors je suggère fortement vous regardez dans cette méthode.

Toutefois, si votre seule passe un niveau profond, ou seulement pour un petit graphique d'objets, alors il pourrait être utile de simplement le faire à la main et mettre en œuvre votre propre IDeepCloneable sur vos entités ...

public interface IDeepCloneable<T> 
{ 
    T DeepClone(); 
} 

public class Person : IDeepCloneable<Person> 
{ 
    public string Name { get; set; } 
    public IList<Address> Addresses { get; set; } 

    public Person DeepClone() 
    { 
     var clone = new Person() { Name = Name.Clone().ToString() }; 

     //have to make a clone of each child 
     var addresses = new List<Address>(); 
     foreach (var address in this.Addresses) 
      addresses.Add(address.DeepClone()); 

     clone.Addresses = addresses; 
     return clone; 
    } 
} 

public class Address : IDeepCloneable<Address> 
{ 
    public int StreetNumber { get; set; } 
    public string Street { get; set; } 
    public string Suburb { get; set; } 

    public Address DeepClone() 
    { 
     var clone = new Address() 
         { 
          Street = this.Street.Clone().ToString(), 
          StreetNumber = this.StreetNumber, //value type - no reference held 
          Suburb = this.Suburb.Clone().ToString() 
         }; 
     return clone; 
    } 
} 

//usage: 
var source = personRepository.FetchByName("JoeBlogs1999"); 
var target = source.DeepClone(); 

//at this point you could set any statuses, or non cloning related changes to the copy etc.. 

targetRepository.Add(target); 
targetRepository.Update; 

Pour savoir pourquoi je n'utilise pas l'interface ICloneable pour cela ... vérifier ce fil: Should I provide a deep clone when implementing ICloneable?

+0

merci pour la réponse, j'avais trouvé et vu des implémentations similaires pour le clonage, j'espérais qu'il y aurait un morceau de Linq 2 SQL magique qui le ferait pour moi en suivant le pseudo code de la question. – JoeBlogs1999

Questions connexes