残念ながら、ここで行っているのは、変数をオブジェクトdraftProjectEntity
への参照に設定することです。projectEntity
つまり、それらは現在同じオブジェクトを指しています。あなたがする必要があるのは、の深いクローンですprojectEntity
。
リフレクションでこれを行う方法はいくつかあります。これを頻繁に行う場合は、この方法を検討することを強くお勧めします。
ただし、1 レベルだけ深くする場合、またはオブジェクトの小さなグラフのみを対象とする場合は、単純に手動で実行し、エンティティに独自の 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 インターフェイスを使用しない理由については、次のスレッドを確認してください: ICloneable を実装するときにディープ クローンを提供する必要がありますか?