2

ProjectAwards ProjectTeamMember など、いくつかの子テーブルを持つプロジェクト エンティティがあります。

プロジェクト (および子テーブル) のデータを新しいプロジェクト レコードにコピーし、プロジェクトのステータスを更新したいと考えています。

例えば

var projectEntity = getProjectEntity(projectId);

draftProjectEntity = projectEntity
draftProjectEntity.Status = NewStatus

context.SubmitChanges();

Marc Gravell からこのリンクを見つけました

その途中ですが、子レコードを新しいdraftProjectに更新します。コピーする必要があります。

4

1 に答える 1

1

残念ながら、ここで行っているのは、変数をオブジェクト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 を実装するときにディープ クローンを提供する必要がありますか?

于 2010-05-12T08:17:18.900 に答える