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?
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