К сожалению, что вы здесь делаете, задайте переменную draftProjectEntity
ссылкой на объект projectEntity
. То есть, они теперь указывают на один и тот же объект. Что вам нужно сделать, это глубокий клон из projectEntity
.
There are ways of doing this with Reflection - если вы собираетесь это сделать, то я настоятельно рекомендую вы изучите этот метод.
Однако, если ваш будет только один уровень, или только для небольшого графа объектов, то это может быть стоит просто делать это вручную и реализации собственного IDeepCloneable на ваших лиц ...
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;
Для получения информации о том, почему я не использую интерфейс ICloneable для этого ... проверьте эту тему: Should I provide a deep clone when implementing ICloneable?
спасибо за ответ, я нашел и увидел похожие реализации для клонирования, я надеялся, что будет часть Linq 2 SQL магия, которая будет делать это для меня по строкам псевдо-кода вопроса. – JoeBlogs1999