6

AutoMapper を使用して UI モデルを POCO に変換し、後で DataContractSerializer を使用して XML にシリアル化し、それらの間の参照を保持しています。

問題は、マッピング時に、これらのエンティティ間の参照が失われることです。

UI クラスは相互に参照しますが、マッピング プロセスはすべての参照に対して新しいインスタンスを作成するため、元の関係は壊れています :(

説明させてください:

タイプPersonのエンティティが2つあります

    Person 
    { 
        List<House> OwnedHouses 
    }

そして、これらの2つのオブジェクト

所有するジョン

  • ハウス1

ウィル も所有

  • ハウス1

AutoMapper が各 Person を正しくマッピングするとき、しかし House1 も 2 つの異なるインスタンスとしてマッピングするとき!!

したがって、House1 のコピーが 2 つあります。John は自分の House1 (#1) を所有し、Will は自分の House1 (#2) を所有しています。

それらはもうリンクされていません。

元々存在していた関係を維持する方法はありますか?

ありがとう。

EDITED:実際に私が持っているのはこれです:

Document には、ChildDocuments のリストが含まれています。各 ChildDocument には、Designables (Rectangles、Lines、Ellipses など) のリストと、ANOOTHER ChildDocument を含む ChildDocumentAdapter と呼ばれる特別な designable があります。これは問題です。別の ChildDocument を参照できます。

ダイアグラム

4

2 に答える 2

3

私が質問を理解している場合、2 つの別々のマッピング操作を実行しています。1 つはジョン用、もう 1 つはウィル用です。

@サニーは正しいです。AutoMapper はこれを行うようには設計されていません。あなたが行う各呼び出しMapper.Map()は、通常、他の呼び出しとは無関係です。HouseListConverter の同じインスタンスを使用することで、マップされたすべての家を辞書にキャッシュできるという利点があります。ただし、グローバルに登録するか、グループ化するマッピング呼び出しのオプションとして渡す必要があります。これは単なる余分な作業ではなく、コンバーターの奥深くに非常に重要な実装の詳細が隠されています。

John と Will の両方を 1 つの操作でマップし、それらをコレクションに入れると、カスタム コンバーターやリゾルバーを必要とせずに、必要な出力が得られます。

同様の問題を抱えている他の人にとっては、より簡単な代替手段になる可能性があります。

public void MapListOfPeopleWithSameHouse()
{
    Mapper.CreateMap<Person, PersonDTO>();
    Mapper.CreateMap<House, HouseDTO>();

    var people = new List<Person>();
    var house = new House() { Address = "123 Main" };
    people.Add(new Person() { Name = "John", Houses = new List<House>() { house } });
    people.Add(new Person() { Name = "Will", Houses = new List<House>() { house } });

    var peopleDTO = Mapper.Map<List<PersonDTO>>(people);
    Assert.IsNotNull(peopleDTO[0].Houses);
    Assert.AreSame(peopleDTO[0].Houses[0], peopleDTO[1].Houses[0]);
}
于 2015-08-13T18:54:04.187 に答える